似乎std::get
只用于元组类。为什么不在标准库中使它成为元组的成员类,还有其他用法吗?
get是一个非成员函数的原因是,如果此功能是作为成员函数提供的,那么依赖于模板参数的类型的代码将需要使用template关键字。
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
用法?对我来说,第一个更好。
还有一个更老的,更少c ++ 11特定的,通常更一般的答案版本。 (如果您只是想知道具体案例,则无需继续阅读)。
自由函数的一般情况在this classic DrDobb's article中由绝对的C ++大师描述。
简短的甜蜜版本:如果您将公共接口与访问私有成员的公共接口和仅访问公共接口的公共接口分开,则您在该类的类和操作之间会更难分离。
它看起来有点难看,降低了大多数IDE的帮助,但对你的代码模块性有一些深远的影响,特别是当你接受最后一次std
迭代的模板狂热时。马蒂亚斯的答案描绘了一个明显的例子。
更经典的优点是,您可以在额外标头内提供一组免费功能,用户可以根据需要包含这些功能。现在考虑模板化但完全独立的类A
和B
之间的互操作。你现在可以通过提供像A_B_interop.h
这样的标题将它们绑定在一起,这些标题充满了免费功能,而无需切换范例。你包括那个标题,这些类变得更强大。