我有以下内容:
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<>
要求tidx
为constexpr
如何让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(“元组在这里是错误的选择”):
需要一个不同类型的集合列表,几个不同的列表,每个列表都有自己的集合;你打算做什么?元组适合法案,因为它可以容纳不同的类型,还有什么?
答案 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。