2012-01-07 9 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' को' args ... 'पारित लेकिन पहले पैरामीटर यह उम्मीद एक' int' है। – SirGuy

+0

आप बिल्कुल सही हैं, धन्यवाद :) – filmor

0

आप अभी भी इस प्रश्न में रूचि रखते हैं?

मैं सी ++ 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; 
} 

पी.एस .: मेरा बुरा अंग्रेजी