В стандартной библиотеке?
Нет, насколько я знаю.
Но написать это тривиально.
template <typename, typename>
struct is_same_template : public std::false_type
{ };
template <template <typename> class C, typename T, typename U>
struct is_same_template<C<T>, C<U>> : public std::true_type
{ };
Так что вы можете написать
static_assert( true == is_same_template<foo<int>, foo<float>>::value, "!" ) ;
static_assert( false == is_same_template<foo<int>, bar<int>>::value, "!" );
Проблема этого решения заключается в том, что специализация работает только для баз шаблонов-шаблонов, получающих только один параметр типа шаблона.
Вы можете улучшить его для баз (аргументов шаблонов-шаблонов), получающих variadi c список аргументов
template <template <typename...> class C,
typename ... Ts, typename ... Us>
struct is_same_template<C<Ts...>, C<Us...>> : public std::true_type
{ };
, но это не помогает проверить, например, std::array
static_assert( true == is_same_template<std::array<int, 3u>,
std::array<float, 5u>>::value, "!" ) ;
Для std::array
необходимо добавить другую специализацию
template <template <typename, std::size_t> class C,
typename T1, std::size_t S1, typename T2, std::size_t S2>
struct is_same_template<C<T1, S1>, C<T2, S2>> : public std::true_type
{ };
К сожалению, существует бесчисленное множество возможных сигнатур шаблонов, поэтому вы должны добавить неисчислимые is_same_template
специализации.
Это причина (я полагаю), что нет стандартной библиотеки свойства типов.