2014-11-21 35 views
1

我很感激你對下面的簡單示例的幫助:如何實例從模板對象的數組與運行參數

template<int N> 
struct Q { 
    struct X { 
     virtual int v() = 0; 
    }; 
    template<int i> 
    struct Z : X { 
     virtual int v() { return i; } 
    }; 
    Z<0> z1; 
    /* ... */ 
    Z<N-1> zN; 

    X * x[N] = { &z1, /* ... */ &zN }; 
}; 

Q<4> q; 

這個例子的最終目標是創建QX N個元素每個都指向一個對象實例從具有自己的參數的模板創建。

回答

1
#include <utility> 
#include <tuple> 
#include <iostream> 

template <int N, typename T = std::make_index_sequence<N>> 
struct Q; 

template <int N, std::size_t... Is> 
struct Q<N, std::index_sequence<Is...>> 
{ 
    struct X 
    { 
     virtual int v() = 0; 
    }; 

    template <int i> 
    struct Z : X 
    { 
     virtual int v() { return i; } 
    }; 

    std::tuple<Z<Is>...> z; 

    X * x[N] = { &std::get<Is>(z)... }; 
}; 

int main() 
{ 
    Q<4> q; 
    std::cout << q.x[0]->v() << std::endl; 
    std::cout << q.x[1]->v() << std::endl; 
} 

DEMO

+0

不幸我在具有GCC-4.7不支持-std = C++ 14的Debian 7。 – hutorny 2014-11-21 10:06:50

+0

@hutorny [here](http://coliru.stacked-crooked.com/a/ad3e218b24973381)是C++ 11的實現 – 2014-11-21 10:08:18

+0

謝謝!這編譯和運作良好! – hutorny 2014-11-21 12:36:04

0

您可以使用以下:

namespace detail 
{ 
    template <template <int> class Z, typename Seq> struct tuple_Z; 


    template <template <int> class Z, std::size_t ... Is> 
    struct tuple_Z<Z, std::index_sequence<Is...>> 
    { 
     using type = std::tuple<Z<Is>...>; 
    }; 

    template <typename X, std::size_t N, typename Tuple, std::size_t ... Is> 
    constexpr std::array<X*, N> make_X_Array(Tuple& t, std::index_sequence<Is...>) 
    { 
     return {{(&std::get<Is>(t))...}}; 
    } 

} 


template<int N> 
struct Q { 
    struct X { 
     virtual int v() = 0; 
    }; 
    template<int i> 
    struct Z : X { 
     virtual int v() { return i; } 
    }; 

    Q() : Xs(detail::make_X_Array<X, N>(Zs, std::make_index_sequence<N>())) {} 

    typename detail::tuple_Z<Z, typename std::make_index_sequence<N>>::type Zs; 
    std::array<X*, N> Xs = 
     detail::make_X_Array<X, N>(Zs, std::make_index_sequence<N>()); 
}; 

Live example

相關問題