2015-06-03 16 views
6

मैं इस महान लेख भर में आया था: http://pdimov.com/cpp2/simple_cxx11_metaprogramming.htmlvariadic टेम्पलेट्स प्रकार कटौती

निम्न कोड में:

template<class A, template<class...> class B> struct mp_rename_impl; 

template<template<class...> class C, class... T, template<class...> class B> 
struct mp_rename_impl<C<T...>, B> 
{ 
    using type = B<T...>; 
}; 

template<class A, template<class...> class B> 
using mp_rename = typename mp_rename_impl<A, B>::type; 

//... 
mp_rename<mp_list<int, float, void*>, std::tuple>; // -> std::tuple<int, float, void*> 
                // T... will be deduced as int, float, void* 

क्यों सीmp_list (बजाय mp_list < पूर्णांक के रूप में निष्कर्ष निकाला है, नाव , शून्य *>) और टी ...int, float, शून्य *? , B> struct mp_rename_impl < सी < टी ...>, लेकिन मैं समझने के लिए क्यों

+0

कौन सा 'ए'? 'कक्षा ए' या 'टेम्पलेट कक्षा ए'? – Jarod42

+0

मैंने इसे बदल दिया क्योंकि आपने इसे स्पष्ट करने के लिए –

उत्तर

4

साथ

mp_rename<mp_list<int, float, void*>, std::tuple>; 
    संघर्ष:

    मुझे लगता है कि चाल टेम्पलेट विशेषज्ञता हिस्सा है

  • template<class A, template<class...> class B> 
    using mp_rename = typename mp_rename_impl<A, B>::type; 
    

    Amp_list<int, float, void*> है और Bstd::tuple

  • में
    template<class A, template<class...> class B> struct mp_rename_impl; 
    

    Amp_list<int, float, void*> है और B उसी तरह से std::tuple है।

  • विशेषज्ञता

    template<template<class...> class C, class... Ts, template<class...> class B> 
    struct mp_rename_impl<C<Ts...>, B> 
    

    (मैं C को नाम बदलने स्पष्ट होना करने के लिए)
    C, mp_list है Ts...int, float, void* और Bstd::tuple है में

+0

इसे कुछ कारणों से प्राप्त करने में कुछ समय लगा, लेकिन मैं सोच रहा था कि हम कैसे mp_list < Ts... > '' mp_list' और 'Ts ... 'को विभाजित कर सकते हैं। लेकिन 'संरचना mp_rename_impl < C< Ts... >, बी>' टेम्पलेट विशेषज्ञ '<वर्ग ए, टेम्पलेट < class...> कक्षा बी> संरचना mp_rename_impl; ', जो एक बेहतर मिलान है यदि' ए' -> 'mp_list '। विशेषज्ञता 'संरचना mp_rename_impl < C< Ts... >, बी> हमें' सी 'और 'टीएस' अलग करने की अनुमति दें। –

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