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

Why std::get uses template parameter instead of regular parameter?

本文关键字:参数 常规 std get 为什么      更新时间:2023-10-16

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)

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

希望这个演示足够解释:

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

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

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

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

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