可变模板异构容器

Variadic template heterogeneous container

本文关键字:异构      更新时间:2023-10-16

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

struct A {void prnt(){std::cout<<"An";} };    
struct B {void prnt(){std::cout<<"Bn";} };    
struct C {void prnt(){std::cout<<"Cn";} };
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();
}

有什么想法吗?

第页。S.我不想使用boost异构容器,如boost::variantboost::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)>());
    }
};

下面是一些迭代元组的代码:

struct A { void print () { clog << "A" << endl; } };
struct B { void print () { clog << "B" << endl; } };
struct C { void print () { clog << "C" << endl; } };
template<unsigned N>
struct iter
{
    template<typename T>
    static void f (T &t)
    {
        iter<N-1>::f (t);
        get<N> (t).print ();
    }
};
template<>
struct iter<0>
{
    template<typename T>
    static void f (T &t)
    {
        get<0> (t).print ();
    }
};

呼叫代码:

    tuple <A,B,C> t;
    iter<tuple_size<decltype(t)>::value-1>::f (t);

我想你可以修改一下以适应你的需要。您的代码中的NumElements在编译时是已知的,所以我认为您应该完全删除该成员。