Da una domanda precedente:Utilizzando un alias modello invece di un modello all'interno di un modello
Doing a static_assert that a template type is another template
Andy Prowl mi ha fornito questo codice che mi permette di static_assert
che un tipo di modello è un altro tipo di modello:
template<template<typename...> class TT, typename... Ts>
struct is_instantiation_of : public std::false_type { };
template<template<typename...> class TT, typename... Ts>
struct is_instantiation_of<TT, TT<Ts...>> : public std::true_type { };
template<typename T>
struct foo {};
template<typename FooType>
struct bar {
static_assert(is_instantiation_of<foo,FooType>::value, ""); //success
};
int main(int,char**)
{
bar<foo<int>> b; //success
return 0;
}
Questo funziona benissimo.
Ma se cambio il codice come questo per utilizzare un alias di foo
, le cose vanno male:
template<template<typename...> class TT, typename... Ts>
struct is_instantiation_of : public std::false_type { };
template<template<typename...> class TT, typename... Ts>
struct is_instantiation_of<TT, TT<Ts...>> : public std::true_type { };
template<typename T>
struct foo {};
//Added: alias for foo
template<typename T>
using foo_alt = foo<T>;
template<typename FooType>
struct bar {
//Changed: want to use foo_alt instead of foo here
static_assert(is_instantiation_of<foo_alt,FooType>::value, ""); //fail
};
int main(int,char**) {
//both of these fail:
bar<foo<int>> b;
bar<foo_alt<int>> b2;
return 0;
}
può risolvere il problema?
Hmm, sembra che "foo_alt' sia un * typedef-name * e non un * nome-modello * ... ma ciò influisce solo sulla' barra'; puoi mantenere 'main' così com'è. –
Penso che potresti verificare se due tipi sono delle istanze dello stesso modello, anche questo funziona con i modelli di alias. – dyp