gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:00 24 4
gpt4 key购买 nike

在将不同类型的值组合在一起时,我通常会创建自定义结构。这通常很好,我个人觉得命名成员访问更容易阅读,但我想创建一个更通用的 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 语句)或者如果范围太大则不可能。

编辑:我接受了一个答案。既然我已经考虑了语言需要知道什么以及何时需要知道它,我认为它确实有意义。

最佳答案

你说的第二个:

It makes indexing by runtime generated indices difficult (for example for a small finite ranged index I've seen code using switch statements for each possibility) or impossible if the range is too large.

C++ 是一种静态类型语言,必须在编译时

决定涉及的类型

所以一个函数作为

template <typename ... Ts>
auto foo (std::tuple<Ts...> const & t, std::size_t index)
{ return get(t, index); }

Not Acceptable ,因为返回的类型取决于运行时值 index

采用的解决方案:将索引值作为编译时值传递,作为模板参数传递。

如你所知,我想,在 std::array 的情况下是完全不同的:你有一个 get()(方法 at( ),或者接收运行时索引值的 operator[]):在 std::array 中,值类型不依赖于索引。

关于c++ - 为什么 C++ 元组如此奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56937839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com