मान लिया जाये कि हमखाका उर्फ और विशेषज्ञता
template<typename T>
struct Foo
{
};
template<typename T>
struct Bar
{
};
template< template<typename T> class C >
struct Pack
{
template<typename T>
using Container = C<T>;
};
Foo
और Pack<Foo>::Container
अगर हम Foo
के लिए एक विशेषज्ञता है एक ही बात के रूप में इलाज होना चाहिए रहे हैं? वह है:
template< template<typename T> class C >
struct IsFoo : std::false_type
{
};
template<>
struct IsFoo<Foo> : std::true_type
{
};
static_assert(IsFoo<Foo>::value, "Only foos!");
static_assert(IsFoo< Pack<Foo>::Container >::value, "Only foos!"); // ???
static_assert(IsFoo< Pack<Bar>::Container >::value == false, "Not a foo!");
क्या यह दूसरा दावा सही है? अपेक्षित व्यवहार क्या है? बिल्ली, क्या मैं भी वैध करने की कोशिश कर रहा हूं?
मैंने इसे तीन कंपाइलरों पर परीक्षण किया और मुझे अलग-अलग परिणाम मिल गए। ऐसा लगता है कि एमएसवीसी और सीएलएंग, Foo
और Pack<Foo>::Container
एक ही बात नहीं है, लेकिन GCC disagrees, जो ठंडा है, क्योंकि यह वही है जो मैं चाहता था।
तो, कौन सही है?
पीएस: मुझे यकीन नहीं है कि क्या मैं शीर्षक पर सही शब्दावली का उपयोग कर रहा हूं, न ही मेरे प्रश्न के शरीर के अंदर। सुझाव और सुधार स्वागत से अधिक हैं।
मैंने सोचा था कि टेम्पलेट विशेषज्ञता प्रकार या मान के लिए है। यहां 'फू' एक टेम्पलेट है, न तो एक प्रकार और न ही कोई मान। प्रश्न के लिए +1। – zahir
[सीडब्ल्यूजी 1286] (http://wg21.link/cwg1286)। – cpplearner
आपके उदाहरण को संशोधित करना जैसे कि 'IsFoo' का टेम्पलेट पैरामीटर टेम्पलेट के बजाए एक टाइपनाम है, एमएसवीसी और जीसीसी दोनों के पास आपके मूल उदाहरण पर जीसीसी के समान उत्पादन होता है। (देखें: http://coliru.stacked-crooked.com/a/f3052a75286f82e2)। – jtedit