如何为std::tuple创建get()成员函数

How to create a get() member function for a std::tuple

本文关键字:成员 函数 get tuple std 创建      更新时间:2023-10-16

我的问题是std::tuple没有像那样的成员函数

auto t = std::make_tuple(1,2,"foo");
t.get(1);

当我创建包装类arround std::tuple 时,我如何实现这样的函数

这样的函数不可能存在(在当前C++标准中),因为函数参数是一种运行时机制,但在编译时需要知道返回类型。因此,后者不能依赖前者。

改为使用std::get

auto v = std::get<1>(someTuple);

要从元组中获取值,应使用std::get<0>(tuple)

您不可能拥有想要的get函数,因为元组元素不一定是同一类型的(在您的示例中,您有int和字符串)。这个get函数的返回类型是什么?

您可以添加一个模板get函数,这样derived_tuple.get<0>()将返回第一个元素。

这里实际上有两个问题。第一种是

为什么get有一个模板积分参数,而不是一个接受这个值作为函数参数。

这个问题已经得到了回答。

另一个问题是

为什么get是一个免费函数而不是成员函数

对此,答案似乎是-这样在模板化类型上调用,就不需要使用关键字typename。实例假设元组有一个get作为成员,它必须像下面代码中那样被调用:

template <class T> void foo(T tuple) {
    tuple.template get<1>() = 42;
}

这个template当然是个麻烦。