有提供左值和右值重载的同时删除重复代码的方法吗?

问题描述 投票:1回答:1

学习C ++时,我决定编写一个简单的模板化二进制搜索树(bst),并遇到以下问题:我希望能够通过向bst传递一个像const T &val这样的左值和一个rvalue来construct bst像T &&val。同样,我希望能够插入左值和右值。所以我最终得到了很多我不喜欢的重复代码:

/// copy constructor
explicit inline constexpr binary_search_tree(const T &val)
    : _root{std::make_unique<binary_search_tree_node>(val)} {}

/// move constructor
explicit inline constexpr binary_search_tree(T &&val)
    : _root{std::make_unique<binary_search_tree_node>(std::move(val))} {}

对于构造函数,其中binary_search_tree_nodebinary_search_tree的私有成员,然后它还必须提供复制和移动构造函数:

struct binary_search_tree_node {
  T value;
  std::unique_ptr<binary_search_tree_node> left;
  std::unique_ptr<binary_search_tree_node> right;

  // prohibit creation of tree_node without value
  inline constexpr binary_search_tree_node() = delete;

  /// copy constructor
  explicit inline constexpr binary_search_tree_node(const T &val)
      : value{val}, left{nullptr}, right{nullptr} {}

  /// move constructor
  explicit inline constexpr binary_search_tree_node(T &&val)
      : value{std::move(val)}, left{nullptr}, right{nullptr} {}
};

也:

inline constexpr void insert(const T &v) {
  if (!_root) {
    _root = std::make_unique<binary_search_tree_node>(v);
    ++_size;
  } else {
    insert(_root, v);
  }
}

inline constexpr void insert(T &&v) {
  if (!_root) {
    _root = std::make_unique<binary_search_tree_node>(std::move(v));
    ++_size;
  } else {
    insert(_root, std::move(v));
  }
}

用于插入功能。

该列表在我要搜索值时会继续出现:我是否应该为find(const T &val) find(T &&val)..?提供重载?

所以我的问题是是否有一种方法可以将这些重载或任何其他方法来删除此重复的代码?

[我读过reference collapsing rules,但不确定是否可以在这里使用此概念。

也欢迎任何其他想法或建议。

c++ overloading code-duplication rvalue lvalue
1个回答
1
投票

是的,您可以使用引用折叠来减少所写函数的数量。

© www.soinside.com 2019 - 2024. All rights reserved.