标准库是否有办法检查两个模板化类型的基本模板类型的相等性?

Qix*_*Qix 1 c++ type-traits template-templates c++17

在想出正确的术语来充分搜索时遇到了麻烦,但是标准库是否有一些东西可以测试相同的基本模板类型?

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);
Run Code Online (Sandbox Code Playgroud)

max*_*x66 5

在标准库中?

不,据我所知。

但是写起来很麻烦。

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
 { };
Run Code Online (Sandbox Code Playgroud)

所以你可以写

static_assert( true == is_same_template<foo<int>, foo<float>>::value, "!" ) ;
static_assert( false == is_same_template<foo<int>, bar<int>>::value, "!" );
Run Code Online (Sandbox Code Playgroud)

该解决方案的问题在于,特化仅适用于仅接收一个模板类型参数的模板-模板库。

您可以改进它,用于接收可变参数列表的基础(模板模板参数)

template <template <typename...> class C,
          typename ... Ts, typename ... Us>
struct is_same_template<C<Ts...>, C<Us...>> : public std::true_type
 { };
Run Code Online (Sandbox Code Playgroud)

但这并不能通过示例进行检查, std::array

static_assert( true == is_same_template<std::array<int, 3u>,
                                        std::array<float, 5u>>::value, "!" ) ;
Run Code Online (Sandbox Code Playgroud)

因为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
 { };
Run Code Online (Sandbox Code Playgroud)

不幸的是,有无数可能的模板-模板签名,因此您必须添加无数的is_same_template专业化。

这就是(我想)没有标准库类型特征的原因。