Variadic模板异构容器 [英] Variadic template heterogeneous container

查看:123
本文介绍了Variadic模板异构容器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要实现一些具有异构元素的可变模板容器类,这允许通过这些元素进行迭代。我的第一个想法是使类std :: tuple成员与可变参数,但从元组通过数组类方式(通过循环)是不可能的:

I need to implement some variadic template container class with heterogeneous elements, which allows to iterate by these elements. My first idea is make class with std::tuple member with variadic arguments, but getting elements from tuple by array-like manner (via loops) is impossible:

struct A {void prnt(){std::cout<<"A\n";} };    
struct B {void prnt(){std::cout<<"B\n";} };    
struct C {void prnt(){std::cout<<"C\n";} };

template<typename...Arg>
struct Prc
{
    Prc() : NumElems(sizeof...(Arg)), mems(std::make_tuple(Arg()...)){}

    int NumElems;
    std::tuple<Arg...> mems;

    void process()
    {
        for(int i=0; i<NumElems; ++i)
         std::get<i>(mems).prnt();//It's forbidden: "i" must be a constant
    }
};

int main()
{
    Prc<A,B,C> obj;
    obj.process();
}

有任何想法吗?

PS我不想使用boost异质容器,例如 boost :: variant boost :: any

P.S. I don't want use boost heterogenous containers, like boost::variant or boost::any

推荐答案

这是使用指数完成的:

namespace detail
{
    template <int... Is>
    struct index { };

    template <int N, int... Is>
    struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };

    template <int... Is>
    struct gen_seq<0, Is...> : index<Is...> { };
}

template <typename...Args>
struct Prc
{
    std::tuple<Args...> mems;

    template <int... Is>
    void process(detail::index<Is...>)
    {
         auto l = { (std::get<Is>(mems).prnt(), 0) ... };
    }

    void process()
    {
        process(detail::gen_seq<sizeof...(Args)>());
    }
};

这篇关于Variadic模板异构容器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆