很难找到正确的术语来进行适当的搜索,但是标准库是否可以对相同的基本模板类型进行测试?
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);
在标准库中?
据我所知不。
但是写起来很简单。
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, "!" );
此解决方案的问题是,该专业化仅适用于仅接收一个模板类型参数的模板模板库。
您可以改进它,对于接收可变参数列表的基础(模板模板参数)
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
专长。
这是原因(我想)没有标准的库类型特征。