2012-01-07 67 views
5

如果將以下代碼中的X轉換爲使用C++ 11變量模板,並且應該支持任意數量的模板參數,那該怎麼辦?將變異模板鏈接在一起

template<int OFFSET> 
struct A { enum O { offset = OFFSET }; enum S { size = 2 }; }; 

template<int OFFSET> 
struct B { enum O { offset = OFFSET }; enum S { size = 4 }; }; 

template<int OFFSET> 
struct C { enum O { offset = OFFSET }; enum S { size = 10 }; }; 

template < template <int> class B0, 
      template <int> class B1, 
      template <int> class B2 > 
struct X : public B0<1>, 
        B1<B0<1>::size * B0<1>::offset >, 
        B2< B1<B0<1>::size * B0<1>::offset >::size * 
         B1<B0<1>::size * B0<1>::offset >::offset > 
{ }; 

int main(int argc, const char *argv[]) 
{ 
    X<A, B, C> x; 
    return 0; 
} 

回答

3

可能:

template <int Var, template <int> Head, typename... Tail> 
struct X_helper : Head<Var>, 
       , X_helper<Head<Var>::size * Head<Var>::offset, Tail...> 
{}; 

template <int Var, template <int> Arg> 
struct X_helper : Head<Var> 
{}; 

template <typename... Args> 
struct X : X_helper<1, Args...> 
{}; 

我希望我得到的語義正確。

+0

有一些細節丟失,你傳遞'參數數量...''到,但X_helper',預計第一個參數是'int'。 – SirGuy 2016-07-05 20:13:18

+0

你是絕對正確的,謝謝:) – filmor 2016-07-06 10:09:14

0

你還對這個問題感興趣嗎?

我正在使用C++ 11,所以我試着回答。

我不知道你想要什麼(呃...你想在2012年),但我認爲下面的例子應該趕上你的要求。

template<int OFFSET> 
struct A { enum O { offset = OFFSET }; enum S { size = 2 }; }; 

template<int OFFSET> 
struct B { enum O { offset = OFFSET }; enum S { size = 4 }; }; 

template<int OFFSET> 
struct C { enum O { offset = OFFSET }; enum S { size = 10 }; }; 

template <int N, template <int> class ...> 
    struct H; 

template <int N> 
    struct H<N> 
    { }; 

template <int N, 
      template <int> class C1, 
      template <int> class ... Cs> 
    struct H<N, C1, Cs...> : public C1<N>, 
          public H<C1<N>::size * C1<N>::offset, Cs...> 
    { }; 

template <template <int> class ... C> 
    struct X : public H<1, C...> 
    { }; 

int main() 
{ 
    X<A, B, C> x; 

    return 0; 
} 

P.S:對不起,我的英語不好