【发布时间】:2016-11-22 11:39:32
【问题描述】:
假设我想以增量方式收集元组(或等效的异构容器)中的数据,即以增量方式向元组添加另一个值(和类型)。
类似这样的东西(名称和语法是组成的):
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)并稍后重新解析它,但这似乎有点迂回。
【问题讨论】:
-
如果预先知道预期类型的集合,您可以使用
std::variant对象的容器。 -
你能用一些伪代码说明你想要什么吗?
-
@Leon:不,我需要一个元组,但我事先不知道类型。我将添加一个示例。
-
这与语法无关,而与可用信息有关。
growable_tuple中的元素数量及其类型在编译时是未知的,这是static_assert工作所必需的。 -
@W.F.:更多的是混乱,你需要多个本地对象来存储不断增长的元组——每个对象都有一个额外的条目。另外,我不确定是否要移动,因为这意味着您必须从范围内的许多对象中移动,而您不能触摸。
标签: c++ boost-hana