学习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_node
是binary_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,但不确定是否可以在这里使用此概念。
也欢迎任何其他想法或建议。
是的,您可以使用引用折叠来减少所写函数的数量。