增量增长一个元组

Incrementally Growing a Tuple

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

类似的东西(名称和语法是编造的):

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的包含类型?

是否可以有一个 单个 局部变量来支持这样的 "insert" 最好不用复制?

Hana有这样的设施吗?

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

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

元组是 class,就像任何其他 class。一旦声明,就是永远的class。 A

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>,并且需要额外的工作来确定向量的每个值是什么。

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

请参阅 HOW TO IMPLEMENT A COMPILE-TIME META-CONTAINER IN C++ 和相关文章。有了更多的语法糖,它应该能够提供 OP 的功能。

working code 的示例如下所示:

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 库的最终版本。

这里有关于技术的additional post