为什么std::get使用模板参数而不是常规参数
Why std::get uses template parameter instead of regular parameter?
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<<
的每个过载都是不同的函数。调用哪个函数是在编译时根据参数确定的。那么编译器如何确定在上面的语句中调用哪个重载呢?如果您有一个元组成员,甚至没有重载,该怎么办?
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 将矢量设置为常规参数
- 如何使用模板生成常规参数列表并将其传递给运行时函数?
- 取决于参数的数量,将其返回结构对象,并将其分配给常规结构的对象
- 常规/动态类型作为参数C/C++
- 如何使用常规函数指针作为模板参数
- 为什么std::get使用模板参数而不是常规参数
- 使用非类型模板参数而不是常规参数的原因