假設我們有模板別名和專業化
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!");
第二個斷言是否正確?預期的行爲是什麼?哎呀,我試圖做甚至是有效的?
我在三個編譯器上測試了它,並得到了不同的結果。看起來對於 MSVC和CLang,Foo
和Pack<Foo>::Container
是不一樣的,但是GCC disagrees,這很酷,因爲那正是我想要的。
那麼,誰是對的? PS:我不確定我是否在標題上使用了正確的術語,也沒有在我的問題的正文中使用。建議和更正非常值得歡迎。
我想模板特殊化是類型或值。這裏'Foo'是一個模板,既不是類型也不是值。 +1的問題。 – zahir
[CWG1286](http://wg21.link/cwg1286)。 – cpplearner
修改您的示例,使「IsFoo'的模板參數是一個類型名稱而不是模板,這使MSVC和GCC在原始示例上具有與GCC相同的輸出。 (見:http://coliru.stacked-crooked.com/a/f3052a75286f82e2)。 – jtedit