增量增长一个元组
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。
假设我想在一个元组(或等效的异构容器)中增量收集数据,即将另一个值(和类型)增量添加到元组。
类似的东西(名称和语法是编造的):
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。