Zakładając mamySzablon alias i specjalizacja
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>;
};
Czy Foo
i Pack<Foo>::Container
powinien być traktowany jako samo jeśli mamy specjalizacji dla Foo
? To znaczy:
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!");
Czy to drugie twierdzenie jest poprawne? Jakie jest oczekiwane zachowanie? Heck, czy to, co próbuję zrobić, nawet ważne?
Przetestowałem to na trzech kompilatorach i uzyskałem inne wyniki. Wygląda na to, że dla MSVC i CLang, Foo
i Pack<Foo>::Container
to nie to samo, ale GCC disagrees, co jest fajne, ponieważ dokładnie to chciałem.
Kto ma rację?
PS: Nie jestem pewien, czy używam poprawnej terminologii na tytule, ani w treści mojego pytania. Sugestie i poprawki są mile widziane.
Myślałem szablon specjalizacji jest dla typów lub wartości. Tutaj 'Foo' jest szablonem, ani typem ani wartością. +1 dla pytania. – zahir
[CWG1286] (http://wg21.link/cwg1286). – cpplearner
Modyfikowanie przykładu tak, że parametr szablonu 'IsFoo' jest typem, a nie szablonem powoduje, że zarówno MSVC, jak i GCC mają takie same wyniki jak dla GCC na oryginalnym przykładzie. (patrz: http://coliru.stacked-crooked.com/a/f3052a75286f82e2). – jtedit