Есть ли в стандартной библиотеке способ проверить равенство базового типа шаблона двух шаблонных типов? - PullRequest
1 голос
/ 18 марта 2020

Не можете найти правильную терминологию для адекватного поиска, но есть ли в стандартной библиотеке что-то для проверки на тот же тип базового шаблона?

template <typename T>
struct foo {};

template <typename T>
struct bar {};

static_assert(std::is_same_base_type<foo<int>, foo<float>>::value == 1);
static_assert(std::is_same_base_type<foo<int>, bar<int>>::value == 0);

1 Ответ

5 голосов
/ 18 марта 2020

В стандартной библиотеке?

Нет, насколько я знаю.

Но написать это тривиально.

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 специализации.

Это причина (я полагаю), что нет стандартной библиотеки свойства типов.

...