2017-03-15 13 views
10

क्या कोई तरीका है कि कोई using कीवर्ड के साथ नेस्टेड टेम्पलेट क्लास को उपनाम कर सकता है? इसविविधता पैरामीटर पैक के साथ एक नेस्टेड टेम्पलेट क्लास को उपनाम कैसे करें

template <typename... Types> 
struct Something { 
    template <typename... TypesTwo> 
    struct Another {}; 
}; 

template <typename... Types> 
template <typename... TypesTwo> 
using Something_t = typename Something<Types...>::template Another<TypesTwo...>; 

int main() { 
    Something_t<int><double>{}; 
    return 0; 
} 

इस उत्तर template template alias to a nested template? की तरह कुछ करने के लिए एक तरह से पता चलता है, लेकिन यह अब और नहीं के रूप में संकलक जहां जहां प्रकार सूचियों समाप्त करने के लिए शुरू करते हैं और करने के लिए पता नहीं चलेगा काम करता है, तो दोनों पैरामीटर पैक variadic हैं जाएगा।

+0

आपको इस तरह के विशिष्ट तरीके की आवश्यकता क्यों है? आप कोड को थोड़ा बदल सकते हैं और समान कोड 'Something_t :: Something2 ' – LmTinyToon

+0

@LmTinyToon इसके बिना करना संभव है लेकिन मैं सोच रहा हूं कि यह एक चीज़ है या नहीं। – Curious

+3

@LmTinyToon क्योंकि वह उत्सुक है ...: पी – 101010

उत्तर

2

आप नहीं वास्तव में क्या कहा लेकिन ... यदि आप tuples (या इसी तरह वर्ग) के तर्कों के रूप में अपने variadic प्रकार सूचियों लपेट कर सकते हैं ...

#include <tuple> 

template <typename ... Types> 
struct Something 
{ 
    template <typename ... TypesTwo> 
    struct Another {}; 
}; 

template <typename, typename> 
struct variadicWrapper; 

template <typename ... Ts1, typename ... Ts2> 
struct variadicWrapper<std::tuple<Ts1...>, std::tuple<Ts2...>> 
{ using type = typename Something<Ts1...>::template Another<Ts2...>; }; 

template <typename T1, typename T2> 
using Something_t = typename variadicWrapper<T1, T2>::type; 

int main() 
{ 
    Something_t<std::tuple<int>, std::tuple<double>>{}; 
} 
0

नहीं एक स्टैंडअलोन जवाब है, लेकिन करने के लिए एक अतिरिक्त max66 का जवाब:

आप हो सकता था की कोशिश की इस:

template<typename ... TT, typename ... TTT> 
using Alias = typename Something<TT...>::Another<TTT...>; 

में पहला वास्तव में अच्छा लग रहा है, घ है ना?

समस्या तो है, तथापि पहले से ही एक ही टेम्पलेट पैरामीटर के साथ हो जाएगा:

Alias<int> a; 

कौन सा अब यह क्या है? Something<int>::Another<> या Something<>::Another<int>? और यदि आपके पास अधिक पैरामीटर हैं, तो वितरित कैसे करें? सार्थक समाधान पाने का कोई मौका नहीं। तो नहीं, आप सीधे ऐसा नहीं कर सकते हैं, आपको अधिकतम 66 प्रस्तावों जैसे कि

+1

बहुत यकीन है कि ओपी जानता है कि यह काम नहीं करेगा। जैसा कि सवाल में बताया गया है ... – Barry

+0

उन्होंने खराब वाक्यविन्यास (दो टेम्पलेट पैरामीटर सूचियों) के साथ प्रयास किया - निश्चित * वह * काम नहीं कर सकता। ऊपर अब सही वाक्यविन्यास है (अधिकतम 66 के एवरवर की तुलना करें), लेकिन अभी भी अस्पष्टता के कारण काम नहीं कर सकता ... – Aconcagua

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