2

假设我想增量地收集元组(或等效的异构容器)中的数据,即增量地向元组添加另一个值(和类型)。

这些方面的东西(名称和语法是组成的):

growable_tuple tup;
tup.push_back(42);
//...
tup.push_back("Hello");
//...
tup.push_back(' ');
//...
tup.push_back("World"s);

static_assert(4 == std::tuple_size<tup::type>::value); // or
assert(4 == tup.size());

我可以使用std::tuple_cat,但我需要将结果复制并存储在每个这样的不同局部变量中cat

我不能使用std::any,因为我不知道包含的类型。有没有这样一种方法可以提取包含的类型any

是否有可能有一个局部变量支持这种“插入”,最好不复制?

Hana有这样的设施吗?

基本上,我想要一个不会擦除类型的异构容器,以便以后可以访问它们。
我还可以假设插入不依赖于运行时(没有运行时循环插入)。
具体来说,我可以手动查看添加到元组的所有类型(和索引)的代码,并使用它来定义我的初始元组。所有数据在编译时都存在。
我想知道如果没有事先手动指定元组类型就没有办法做到这一点。

一种明显的方法是增量序列化数据(例如到 json)并稍后重新解析它,但这似乎有点迂回。

4

2 回答 2

3

令人惊讶的是,这显然是可能的。

请参阅如何在 C++ 中实现编译时元容器和相关文章。加上更多的语法糖,它应该能够提供 OP 的功能。

工作代码示例如下所示:

int main () {
  using LX = atch::meta_list<class A>;

  LX::push<void, void, void, void> ();
  LX::set<0, class Hello> ();
  LX::set<2, class World> ();
  LX::pop ();

  print_type<LX::value<>> ();
}

输出:
void print_type() [T = atch::type_list<Hello, void, World>]

这比仅将类型附加到列表更强大。
我期待smeta图书馆的最终发布。

关于该技术的附加帖子在这里。

于 2016-11-27T09:36:41.660 回答
0

元组是一个类,就像任何其他类一样。一旦声明,它就是那个类。一个

std::tuple<int, char *>

一旦声明,将永远是一个std::tuple<int, char *>. C++ 是一种静态类型语言。每个对象的类型都已声明,并且是已知的。一旦一个对象std::tuple<int, char *>变成了它将成为的样子,它就不能以某种方式变成一个std::tuple<int, char *, char *>

使用 C++17,可以通过使用

std::vector<std::any>

any对象的向量,然后将任意对象添加到向量中。这个对象的类型总是std::vector<std::any>,并且需要额外的工作来确定向量的每个值是什么。

于 2016-11-22T12:06:28.473 回答