为什么c ++ 11将get <>(tuple)定义为全局函数而不是tuple的成员?

时间:2018-09-12 18:38:54

标签: function c++11 get tuples member

似乎std::get仅用于元组类。为什么不让它成为标准库中元组的成员类,还有其他用法?

2 个答案:

答案 0 :(得分:3)

  

get是非成员函数的原因是,如果此功能   已作为成员函数提供,代码取决于类型   模板参数上将需要使用模板   关键字。

source

get是非成员函数时的代码片段:

template<class T>
void foo ( tuple<T>& t ) {
    get<0>(t) = 10; // get is non-member function
}

,如果get是元组的成员函数,则另外一个:

template<class T>
void foo ( tuple<T>& t ) {
    t. template get<0>() = 10; // ugly
}

您更喜欢get的哪个版本?对我来说,第一个更好。

答案 1 :(得分:1)

答案也有较旧的,较少的c ++ 11特定的和通常更通用的版本。 (如果您只是想知道具体情况,则无需继续阅读)。

自由功能的一般情况在this classic DrDobb's article中由绝对的C ++专家描述。

n个简短的版本:如果您将访问私有成员的公共接口和只能访问公共接口的公共接口分开,则在类和该类上的操作之间将更加困难。

它看起来有些丑陋,降低了大多数IDE的实用性,但对代码模块化有一些深远影响,尤其是当您拥抱最近std个迭代的模板狂潮时。马蒂亚斯(Matthias)的回答描绘了一个清晰的例子。

一个更经典的优点是,您可以在一个额外的标头中提供一组自由函数,用户可以按需添加这些标头。现在考虑一下模板化的类AB之间的互操作。现在,您可以通过提供诸如A_B_interop.h之类的标头将它们绑在一起,该标头具有免费功能,而无需切换范例。包括该标头,类将变得更强大。