我通常创建自定义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)
or
get(t,0)
优点是什么?我只看到以下问题:
- 像这样使用模板参数看起来很奇怪。我知道模板语言是图灵完备的,但仍然......
- 它使得通过运行时生成的索引进行索引变得困难(例如,对于小型有限范围索引,我见过针对每种可能性使用 switch 语句的代码),或者如果范围太大则不可能进行索引。
Edit:我已经接受了答案。现在我已经考虑了语言需要了解什么以及何时需要了解它,我认为它确实有意义。
第二个你说:
它使得通过运行时生成的索引进行索引变得困难(例如,对于小型有限范围索引,我见过针对每种可能性使用 switch 语句的代码),或者如果范围太大则不可能进行索引。
C++ is a strongly static typed language and has to decide the involved type compile-time
所以一个函数为
template <typename ... Ts>
auto foo (std::tuple<Ts...> const & t, std::size_t index)
{ return get(t, index); }
不可接受,因为返回的类型取决于运行时值index
.
采用的解决方案:将索引值作为编译时值传递,从而作为模板参数。
如你所知,我想,如果是std::array
: 你有一个get()
(方法at()
,或者也可以是operator[]
)接收运行时索引值:std::array
值类型不依赖于索引。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)