2017-10-08 7 views
7

होने की अपनी संपत्ति को संरक्षित करने के बाद मुझे कुछ समय बाद टेम्पलेट टेम्पलेट-पैरामीटर की एक शक्ति मिली। उदाहरण देखें निम्नलिखित स्निपेट:क्या टेम्पलेट टेम्पलेट पैरामीटर पर उपनाम टेम्पलेट्स को कम करने का कोई तरीका है, जबकि अभी भी संदर्भ

template <template <class> class TT, class T> 
void foo(TT<T>) { 
} 

template <class T> 
using typer = T; 

int main() { 
    foo<typer>(int{}); 
} 

उर्फ ​​टेम्पलेट एक टेम्पलेट टेम्पलेट पैरामीटर के रूप में टेम्पलेट को पारित कर दिया है और के रूप में यह संदर्भ निष्कर्ष निकाला है टेम्पलेट के अन्य पैरामीटर पता लगाने के लिए आगे किया जाता है। सुंदरता!

हालांकि जब उर्फ ​​स्वयं टेम्पलेट की जरूरत है यह लग रहा है compilers की तरह पागल हो निष्कर्ष निकाला जाना चाहिए:

template <template <class> class> 
struct tag{}; 

template <template <class> class TT, class T> 
void foo(tag<TT>, TT<T>) { 
} 

template <class T> 
using typer = T; 

int main() { 
    foo(tag<typer>{}, int{}); 
} 

[live demo]

संकलनकर्ता निश्चित रूप से सही रूप में TT दोनों tag<TT> से और साथ निष्कर्ष निकाला जा सकता है TT<T>foo के पैरामीटर के रूप में, और int{} टेम्पलेट टेम्पलेट से टाइप पैरामीटर पैटर्न से मेल नहीं खाता है। T के लिए कटौती संदर्भ को संरक्षित करने का कोई तरीका है लेकिन TT<T> में गैर-कटौती संदर्भ बनाएं?

पीएस मेरे इरादे शुद्ध हैं और यह सिर्फ एक सैद्धांतिक प्रश्न है जिसके पीछे कोई समस्या नहीं है।

+0

ईमानदारी से मैं पहले _beautifulne के लिए कोई उपयोग नहीं देख सकता एसएस_ और न ही दूसरे प्रयास के लिए। वैसे भी सवाल दिलचस्प है, +1। – skypjack

+0

@skypjack जैसा कि मैंने कहा था कि मैंने संभावित उपयोगों के बारे में भी सोचा नहीं है, इसलिए आप सही हो सकते हैं कि कोई भी नहीं है ... –

उत्तर

2

मुझे लगता है कि यह आसान/साफ हो की तरह कुछ लिखने के लिए होगा:

template <template <class> class TT, class T> 
void foo(tag<TT>, T, std::enable_if_t< std::is_same<T,TT<T>>::value >* = 0) 

या उससे कम विवश

template <template <class> class TT, class T> 
void foo_impl(tag<TT>, TT<T>){} 

template <template <class> class TT, class T> 
void foo(tag<TT> a, T b){ foo_impl<TT>(a, b); } 
एक पक्ष नोट के रूप में

, इस से पता चलता है कि (गैर मानक) में टिप्पणी मानक दावा करते हैं कि एक उपनाम टेम्पलेट नाम कभी भी कुछ हद तक गलत नहीं है ...

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

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