2012-03-16 10 views
6

मैं this SO question पर देख रहा था और मुझे समझ में नहीं आया कि उत्तर कैसे काम करता है। return callFunc(typename gens<sizeof...(Args)>::type()); परयह विविध टेम्पलेट कैसे काम करता है?

template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {}; 

उदाहरण में मुझे लगता है कि sizeof..(Args) संभालने हूँ:

template<int ...> struct seq {}; 

// How does this line work? 
template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {}; 

template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; }; 

double foo(int x, float y, double z) 
{ 
    return x + y + z; 
} 

template <typename ...Args> 
struct save_it_for_later 
{ 
    std::tuple<Args...> params; 
    double (*func)(Args...); 

    double delayed_dispatch() 
    { 
    return callFunc(typename gens<sizeof...(Args)>::type()); 
    } 

    template<int ...S> 
    double callFunc(seq<S...>) 
    { 
    return func(std::get<S>(params) ...); 
    } 
}; 

int main(void) 
{ 
    std::tuple<int, float, double> t = std::make_tuple(1, 1.2, 5); 
    save_it_for_later<int,float, double> saved = {t, foo}; 
    cout << saved.delayed_dispatch() << endl; 
} 

हिस्सा मुझे समझ नहीं आता यह है: मैं संदर्भ के लिए जवाब में से एक में कोड की एक प्रति पोस्ट करेंगे होगा। तो,

template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {}; 

हो जाता है

template<3, {}> struct gens : gens<3-1, 3-1, {}> {}; 

यह सही है, और यदि हां, क्या वहाँ से क्या होता है?

उत्तर

7

चलो मैन्युअल प्रत्यावर्तन लिख:

gens<3> : gens<2, 2> 
gens<3> : gens<2, 2> : gens<1, 1, 2> 
gens<3> : gens<2, 2> : gens<1, 1, 2> : gens<0, 0, 1, 2> 

प्रत्यावर्तन 0 के लिए आंशिक विशेषज्ञता की वजह से बंद हो जाता है:

struct gens<0, S...>{ typedef seq<S...> type; }; 

// first 0 consumed by the partial specialization 
// S = 0,1,2 
struct gens<0, 0, 1, 2> { 
    typedef seq<0, 1, 2> type; 
} 
+0

धन्यवाद। इस तरह से रिकर्सन का उपयोग वास्तव में मुझे फेंक दिया। –

+0

धन्यवाद, मैं भी इस भाग से पूरी तरह उलझन में था। – Zeks

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^