Function 为什么是c++;11定义get<&燃气轮机;(元组)作为全局函数而不是元组的成员?

Function 为什么是c++;11定义get<&燃气轮机;(元组)作为全局函数而不是元组的成员?,function,c++11,get,tuples,member,Function,C++11,Get,Tuples,Member,似乎std::get仅用于元组类。为什么不让它成为标准库中元组的成员类,还有其他用法吗 get是非成员函数的原因是如果 已作为成员函数提供,该函数是类型所依赖的代码 对于模板参数,则需要使用模板 关键词 get为非成员函数时的代码段: template<class T> void foo ( tuple<T>& t ) { get<0>(t) = 10; // get is non-member function } 您喜欢哪个版本的get

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

get是非成员函数的原因是如果 已作为成员函数提供,该函数是类型所依赖的代码 对于模板参数,则需要使用模板 关键词

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

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

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

还有一个更老、更不特定于c++11、更通用的答案版本。(如果您只是想了解具体案例,则无需继续阅读)

自由函数的一般情况由绝对C++ Gruru描述。< /P> 简短的n sweet版本:如果您将访问私有成员的公共接口和仅访问公共接口的公共接口分开,则类和该类上的操作之间的分离将更加困难

它看起来有点难看,降低了大多数IDE的有用性,但对代码模块化有着深远的影响,特别是当您接受上一次
std
迭代的模板狂热时。马蒂亚斯的回答描述了一个明确的例子


一个更经典的优点是,您可以在额外的头中提供一组免费函数,用户可以根据需要包含这些函数。现在考虑一下模板化但完全独立的类
A
B
之间的互操作。现在,您可以通过提供像
a_B_interop.h
这样的标题将它们绑定在一起,该标题充满了自由函数,而无需切换范例。如果包含该标头,类将变得更强大。

我猜这是一个模板函数,您无法封装它,因为您不知道需要编译成一个对象的实例有多少。似乎
std::get
仅用于元组类。有很多
std::get
函数:
std::array
std::variant
,等等。我想原因与
std::size
std::empty
类似。
template<class T>
void foo ( tuple<T>& t ) {
    t. template get<0>() = 10; // ugly
}