为什么 C++ 元组如此奇怪?

2024-05-25

我通常创建自定义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(使用前将#替换为@)

为什么 C++ 元组如此奇怪? 的相关文章

随机推荐