Предполагая, что
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 не согласен, что здорово, потому что это именно то, что я хотел.
Итак, кто прав?
PS: Я не уверен, использую ли я правильную терминологию для названия и внутри моего вопроса. Предложения и исправления более чем приветствуются.