2015-03-12 13 views
13

निम्नलिखित कोड पर विचार करें:क्या टेम्पलेट उपनाम बनाना संभव है?

template< template< typename ... > class ... Ts > 
struct unite 
{ 
    template< typename ... T > 
    struct type 
     : Ts< T ... > ... 
    { }; 
}; 

// This does not work as ::type does not name a type, but a template: 

// template< template< typename ... > class ... Ts > 
// using unite_t = typename unite< Ts ... >::type; 

template<typename> struct debug_none {}; 
template<typename> struct debug_cout {}; 

template< typename ... > struct raise_demangled {}; 
template< typename ... > struct raise_specialized {}; 

template< typename, typename = int > struct match_default {}; 

template< template< typename ... > class Control > 
void f() 
{} 

int main() 
{ 
    f< unite< debug_none, raise_demangled, match_default >::type >(); 

    // Is there any way to create something like unite_t which works like this: 

    // f< unite_t< debug_none, raise_demangled, match_default > >(); 
} 

Live example

प्रश्न: वहाँ एक प्रकार उर्फ ​​के समान "टेम्पलेट उर्फ" किसी तरह का बनाने के लिए कोई तरीका है? (उपरोक्त उदाहरण में unite_t देखें)

+1

तो, प्रश्न: मुझे याद आया जैसे मैंने लिखा था कि मैंने पहले इस सटीक प्रश्न से पूछा था। क्या मुझे अपना http://stackoverflow.com/questions/17356487/equivalent-of-using-aliases-for- टेम्पलेट्स को इस के डुप्लिकेट के रूप में बंद करना चाहिए? या ठीक इसके विपरीत? :) – Yakk

+1

@Yakk हालांकि आपका प्रश्न काफी समान है और उसी क्षेत्र में, मुझे नहीं लगता कि यह वास्तव में एक डुप्लिकेट है, क्योंकि आपने किसी भिन्न स्थान पर 'टेम्पलेट' कीवर्ड से छुटकारा पाने का प्रयास किया था। यदि एक * के लिए एक समाधान * मौजूद होगा, तो यह * अन्य समस्या को भी हल कर सकता है - लेकिन ऐसा लगता है कि कोई समाधान नहीं है। –

उत्तर

5

नहीं, आप नहीं कर सकते।

using एक प्रकार, या एक चर "वापसी" कर सकते हैं। यह template "वापस" नहीं कर सकता है। कहीं और कोई समान तंत्र नहीं हैं। उन्हें अंदर एक template<?>using apply=?; उर्फ ​​साथ

आप थोड़ा परंपरा है कि सभी टेम्पलेट टेम्पलेट्स नहीं कर रहे हैं लेने के द्वारा उपयोगी कुछ कर सकते हैं, बल्कि वर्गों (और जब तक हम इसे पर हैं, स्थिरांक std::integral_constants<T,?> हैं, और संकेत pointer_constant<T*,?> हैं)।

अब सबकुछ एक वर्ग है। template एक ::apply<?...> के साथ सिर्फ प्रकार वर्गों के (बन

इस तरह के एक टेम्पलेट के प्रकार का एक बंडल को लागू करने के माध्यम से किया जाएगा:। तो एक "मूल" टेम्पलेट Z साथ

template<class Z, class...Ts> 
using apply_t = Z::template apply<Ts...>; 

, आप ' Z<Ts...> करना चाहते हैं। इन "अप्रत्यक्ष" टेम्पलेट्स के साथ, आप एक टेम्पलेट using उर्फ ​​एक अप्रत्यक्ष टेम्पलेट लौट सकते हैं इस सम्मेलन के साथ apply_t<Z, Ts...> करना चाहते हैं।

,। अपने कोड के बाकी conven का अनुसरण करती है एक टेम्पलेट लागू करने के लिए हमेशा apply_t पर कॉल करने का टयन, और आप लिखने वाले अन्य सभी टेम्पलेट्स को अप्रत्यक्ष-आकार देते हैं, हम कर रहे हैं।

यह बदसूरत है।

+0

क्या इसे ठीक करने का कोई प्रस्ताव है? – Brian

+0

@ ब्रायन नहीं जो मुझे पता है। ऐसे उपनामों की आवश्यकता संदिग्ध है, क्योंकि सी ++ के अपेक्षाकृत उन्नत उपयोग के लिए इसकी आवश्यकता होती है, इसलिए शायद किसी को भी परेशान न हो। – Yakk

+0

आपके उत्तर के लिए धन्यवाद, मैं शायद इसे जल्द ही "स्वीकार्य" के रूप में चिह्नित करूंगा - "नहीं, आप नहीं कर सकते" -part :) दुख की बात है कि सुझाए गए विकल्प/कार्य-आसपास वास्तव में मेरे मामले में उपयोग नहीं किया जा सकता है क्योंकि यह इंटरफ़ेस (जो उपयोगकर्ता की ओर दिखाई देता है) और भी जटिल/बदसूरत। मैं वास्तव में उपयोगकर्ताओं को भ्रमित करने के बजाय इस विचार को छोड़ने पर विचार कर रहा हूं। –

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