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

时间:2016-05-03 21:18:19

标签: c++ c++11 tuples wrapper

我的问题是std :: tuple没有像

这样的成员函数
auto t = std::make_tuple(1,2,"foo");
t.get(1);

当我创建一个包装类arround std :: tuple

时,如何实现这样的功能

3 个答案:

答案 0 :(得分:3)

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

改为使用std::get

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

答案 1 :(得分:0)

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

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

您可以添加模板获取功能,以便derived_tuple.get<0>()将返回第一个元素。

答案 2 :(得分:0)

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

  

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

已经回答了这个问题。

另一个问题是

  

为什么get是一个自由函数而不是一个成员函数

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

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

template肯定是一件令人讨厌的事。