随机访问元组向量中的元组值

时间:2018-05-17 08:55:01

标签: c++ vector tuples

我有以下内容:

template<typename...T> struct VTS : private std::vector<std::tuple<T...> >
{ 
    typedef std::vector<std::tuple<T...> > VT;
    typedef std::tuple<T...> TUP;
    ...
    //I want to do..
    auto getvalue(size_t vidx, size_t tidx)
    {
         return std::get<tidx>(VT::at(vidx));
    }
};

上述内容不起作用,因为std::get<>要求tidxconstexpr 如何让getvalue()或类似的东西工作?

[回答评论] 示例用法如下:

for (size_t i=0; i<myvts.size(); i++)
    for (size_t j=0; j<myvts.tupsize(); j++)
        std::cout << myvts.getvalue(i,j) << "\n";

无论其相关性如何。问题是让auto自动使用getvalue() - 如果可能的话。 std::vector是继承的还是封装的是与问题无关的,虽然我理解并同意,但它在这里被用作“在同一页面上”的快速示例。

回答Hold&amp; Hajo(“元组在这里是错误的选择”):

需要一个不同类型的集合列表,几个不同的列表,每个列表都有自己的集合;你打算做什么?元组适合法案,因为它可以容纳不同的类型,还有什么?

2 个答案:

答案 0 :(得分:1)

您不应该以{{1​​}}方式进行迭代,您可以使用tuple,例如:

std::apply

答案 1 :(得分:-1)

我认为你好像误解了模板和普通代码之间的重要区别。模板在编译时生成,然后修复。将std::tuple<T...>视为结构。 std::tuple<int, 3>类似于

struct int_3
{
   int _1;
   int _2;
   int _3;
};

通过索引在运行时访问元组中的元素没有(好的)方法。你必须在编译时知道索引。

这就是get<> tidx成为constexpr的原因:因为它需要在编译时知道并解决。因此,你的想法完全不起作用。

退一步思考你实际上想要做什么。

你真的想在运行时计算并传递tidx吗?如果是这样,您需要完全不同的数据类型。

或者,如果在编译时知道tidx,则必须将getvalue重写为模板成员函数。那会有用(但是很难看,恕我直言)。

template <size_t tuple_index>
auto get_value(size_t vector_index)
{
   return std::get<tuple_index>(VT::at(vector_index));
}

你会这样称呼

auto val=get_value<3>(4); // return tuple #3 from vector index 4

自己回答以下问题:tidx的值是在编译时始终知道还是在程序运行时计算tidx?

如果在运行时计算tidx,那么元组是错误的选择。

如果在编译时(类型擦除)不知道元组元素的类型,则需要使用&#34; variants&#34;。你可以像这样存储它们:

std::vector<   std::vector<variant> > m_variant_list;
m_variant_list.at(vidx).at(tidx);

一个好主意可能是boost :: any。