其他分享
首页 > 其他分享> > c-可变参数模板异构容器

c-可变参数模板异构容器

作者:互联网

我需要实现具有可变元素的可变参数模板容器类,该类可以通过这些元素进行迭代.我的第一个想法是使用带有可变参数的std :: tuple成员的make类,但是不可能通过类似数组的方式(通过循环)从tuple中获取元素:

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();
}

有任何想法吗?

附:我不想使用boost异构容器,例如boost :: variant或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)>());
    }
};

标签:c,c11,compile-time,metaprogramming
来源: https://codeday.me/bug/20191011/1896015.html