对于给定的类,如果我想编写所有比较运算符,为避免代码重复,我将向它们编写如下内容:
class B {
public:
bool operator==(Type const& rhs) const {
return as_tuple() == rhs.as_tuple();
}
bool operator!=(Type const& rhs) const {
return as_tuple() != rhs.as_tuple();
}
// .. and same for other operators ..
private:
auto as_tuple() const {
return std::tie(a, b, c); // all the members
}
};
我可以在as_tuple()
处实现std::tie()
,也可以在std::forward_as_tuple()
处实现。有区别吗?我该选哪个?
答案 0 :(得分:7)
让我们看一下签名。 std::tie()
是:
template< class... Types > constexpr tuple<Types&...> tie( Types&... args ) noexcept;
template< class... Types > constexpr tuple<Types&&...> forward_as_tuple( Types&&... args ) noexcept;
唯一的区别是,前者仅接受左值,而后者仅接受左值和右值。如果您的所有输入都是左值,就像它们在用例中一样,则它们是完全等效的。
std::tie()
主要用于分配的左侧(例如,std::tie(a, b) = foo;
用于解包pair
),而std::forward_as_tuple()
主要用于传递内容避免复制的功能。但是它们都可以用来解决这个问题。 tie
显然要短得多,并且可以说是众所周知的(tie
的cppreference示例使用它来实现operator<
),这样我就可以投票。
答案 1 :(得分:0)
Here 是一篇关于同一主题的好帖子。
来自链接中的文章:
总而言之,当你需要构建一个元组时,使用:
std::make_tuple
如果您需要返回的元组中的值,std::tie
如果您需要返回的元组中的左值引用,std::forward_as_tuple
如果您需要保留输入的引用类型来构建元组。