逐渐增加元组

时间:2016-11-22 11:39:33

标签: c++ boost-hana

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

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

$(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)并稍后重新解析,但这似乎有点迂回。

2 个答案:

答案 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>,并且需要执行其他工作来确定向量的每个值。