【发布时间】:2019-07-08 15:09:17
【问题描述】:
我通常在将不同类型的值分组在一起时创建自定义structs。这通常很好,我个人发现命名成员访问更容易阅读,但我想创建一个更通用的 API。在其他语言中广泛使用元组后,我想返回 std::tuple 类型的值,但发现在 C++ 中使用它们比在其他语言中更难看。
为了使元素访问使用整数值模板参数,get 做了哪些工程决策,如下所示?
#include <iostream>
#include <tuple>
using namespace std;
int main()
{
auto t = make_tuple(1.0, "Two", 3);
cout << "(" << get<0>(t) << ", "
<< get<1>(t) << ", "
<< get<2>(t) << ")\n";
}
而不是像下面这样简单的东西?
t.get(0)
或
get(t,0)
有什么优势?我只看到了问题:
- 这样使用模板参数看起来很奇怪。我知道模板语言是图灵完备的,但仍然......
- 如果范围太大,它会使通过运行时生成的索引编制索引变得困难(例如,对于一个小的有限范围索引,我已经看到代码对每种可能性都使用 switch 语句)或者不可能。
编辑:我已接受答案。现在我已经考虑了语言需要知道什么以及什么时候需要知道,我认为它确实有意义。
【问题讨论】:
-
"按运行时索引"。也就是说,类型应该在编译时就知道了,所以你不能使用运行时的值作为索引。
-
不是为什么它必须是模板函数的原因,但这是它没有成为成员函数的原因:stackoverflow.com/questions/3313479/…
-
用你的 get 如何根据计算的索引有一个专用的返回类型?在集合中,您有 一个 类型,而不是元组
-
@Jarod42 这不是一个主要缺点吗?如果对它们的使用施加了如此严格的限制,为什么还要使用该机制来实现它们?
-
“使用这样的类型参数看起来很奇怪。” - 它不是类型参数。模板参数可以是编译时整数值而不是类型(并且用于
get<N>)。
标签: c++ c++11 tuples c++-standard-library