2

std::get函数使用模板参数作为常规参数。
举个例子:

std::tuple <int, double, long &, const char *> bar(18, 6.5, 12, "Hello!");
cout << std::get<2>(bar); // Print the tuple’s third element.

为什么这个功能设计成这样?
为什么不使用常规参数呢?
例如,类似:std::get(bar, 2)std::get(2, bar)

4

2 回答 2

10

函数必须具有定义明确的返回类型,在编译时指定。这里的模板特化get<2>是一个返回的函数long&;但是您的版本必须根据在运行时指定的参数返回不同的类型,这是不可能的。

于 2013-08-17T03:41:34.467 回答
5

希望这个演示足以解释:

int x;
std::cin >> x;
auto i = std::get(bar, x);

请记住,在 C++ 中,必须在编译时知道任何对象的类型,什么类型是i?请注意,不能将变量作为模板参数传递,必须传递常量表达式,所以当整数是模板参数时,不存在上述问题。

也许与您的示例更相关的是this。

std::cout << std::get(bar, x);

的每个重载operator<<都是不同的功能。调用哪个函数是在编译时根据参数确定的。那么编译器如何确定在上述语句中调用哪个重载呢?如果您有一个甚至没有重载的元组成员怎么办?

于 2013-08-17T03:43:00.583 回答