假设我想逐步收集元组(或等效的异构容器)中的数据,即逐步向元组添加另一个值(和类型)。
这些方面的东西(名称和语法组成):
$(document).ready(function() {
//attach click on each checkbox
$('input[type=checkbox]').on('click', function(){
// if the current checkbox is checked then you can do what you want!
if ($(this).is(":checked")) {
console.log("testing");
}
});
});
我可以使用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
的包含类型?
是否可以使用支持此类“插入”的单个局部变量,最好不要复制?
Hana有这样的设施吗?
基本上,我想要一个不会删除类型的异构容器,以便以后可以访问它们 我还可以假设插入不依赖于运行时(没有运行时循环插入) 具体来说,我可以手动检查代码,注意添加到元组的所有类型(和索引),并使用它来定义我的初始元组。所有数据都在编译时存在 我想知道如果没有事先手动指定元组类型就没有办法做到这一点。
这样做的一个显而易见的方法是逐步序列化数据(例如json)并稍后重新解析,但这似乎有点迂回。
答案 0 :(得分:3)
令人惊讶的是,这个显然是可能的。
请参阅HOW TO IMPLEMENT A COMPILE-TIME META-CONTAINER IN C++及相关文章。有了更多的语法糖,它应该能够提供OP的功能。
working code的示例如下所示:
stdout
输出:
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>]
库。
此技术的additional post就在这里。
答案 1 :(得分: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
个对象的向量,然后将arbirary对象添加到向量中。此对象的类型将始终为std::vector<std::any>
,并且需要执行其他工作来确定向量的每个值。