Может быть с чертами нестандартного типа.
Что-то вроде следующего
template <typename>
struct is_A : public std::false_type
{ };
template <typename T>
struct is_A<A<T>> : public std::true_type
{ };
// ...
template <typename T>
auto someFunction(T item) {
if( is_A<T>::value ) {
// yep A<int> is 'from' A.
}
}
Или, может быть, вы хотите перехватывать не только A<T>
, но, в общем, все типы, которые являются шаблономтипа, может быть с неопределенным числом аргументов шаблона?
В этом случае вы можете попробовать что-то вроде следующего
template <typename>
struct is_template : public std::false_type
{ };
template <template <typename...> class C, typename ... Ts>
struct is_template<C<Ts...>> : public std::true_type
{ };
Проблема: эта черта типа перехватывает все типы шаблона с аргументами шаблона типа и только аргументы шаблона.Но не перехватывает, например, std::integer_sequence<int, 0, 1, 2, 3, 4, 5>
, который получает тип и некоторый параметр шаблона нетипичного типа.
Вы можете добавить другие специализации для is_template
, чтобы перехватывать другие случаи, но вы не можетеопределить специализацию, которая будет охватывать все типы шаблонов (все комбинации параметров шаблона).