为什么std :: get使用模板参数而不是常规参数?

时间:2013-08-17 03:36:48

标签: c++ templates

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)

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

希望这个演示足够解释:

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

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

或许与你的例子更相关的是这个。

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

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