c++ - std::tie 和 std::forward_as_tuple 有什么区别
问题描述
对于给定的类,如果我想编写所有比较运算符,为了避免代码重复,我会这样写:
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()
. 有区别吗?我应该更喜欢哪个?
解决方案
让我们看看签名。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;
解包 a pair
),而std::forward_as_tuple()
主要是为了在函数中传递东西以避免复制。但它们都可以用来解决这个问题。tie
显然要短得多,并且可以说更知名(tie
使用它来实现的 cppreference 示例operator<
),所以这会得到我的投票。
推荐阅读
- sql - 如何在 SSMS 中合并具有不同数量和列顺序的两个表?
- mongodb - 如何使用 Mongo CLI 保存较大的文件
- java - Querydsl 绑定 - 如何设置绑定以便参数可以使用 Like 和 Contains
- javascript - 我如何在 ReactJS 上比较和连接两个数组
- ios - 如何根据点击的单元格更改数组
- ios - iOS N 如何获取所有用户代理字符串
- python - 在 Keras 中导入 Attention 包会出现 ModuleNotFoundError: No module named 'attention'
- xcode11 - 当项目包含资产目录时,Xcode 11-beta3 构建失败:错误:未知参数“--development-region”
- docker - NTLM Kerberos 支持在 nginx 服务器后面设置的身份服务器(不适用于 IE)
- python - 网络抓取 pubmeds 2., 3., 4... 页面