template<typename T> struct S {};
template<typename T> struct R {};
int main() {
typedef S<double> s1;
typedef S<int> s2;
typedef R<int> s3;
static_assert(xxx<s1, s2>::value,
"No, assertion must not be raised");
static_assert(xxx<s2, s3>::value,
"Yes, assertion must be raised");
}
所以,我希望xxx<s1, s2>::value
返回true而xxx<s2, s3>::value
在编译时返回false。
在C ++中是否存在xxx? 或者,在C ++中理论上是否存在xxx,但可能还没有人完成它?
答案 0 :(得分:5)
使用两个使用模板模板参数的特化来执行此“匹配”:
template<
typename T,
typename V>
struct xxx;
template<
template <class> class A,
template <class> class B,
typename X,
typename Y>
struct xxx<A<X>, B<Y>> {
static constexpr const int value = false;
};
template<
template <class> class U,
typename X,
typename Y>
struct xxx<U<X>, U<Y>> {
static constexpr const int value = true;
};
注意:要使其成为真实的类型特征,您不应手动设置value
,而应来自std::integral_constant
(std::true_type
或std::false_type
)。以上只是我在手机上做的快速模型。
答案 1 :(得分:1)
类似于same_base_template
:
#include <type_traits>
template<class A, class B>
struct same_base_template : std::false_type{};
template<template<class...> class S, class... U, class... V>
struct same_base_template<S<U...>, S<V...>> : std::true_type{};
由于您使用的是非类型模板参数(std::ratio
),因此进行了第三次专业化:
template<class T, template<T...> class S, T... U, T... V>
struct same_base_template<S<U...>, S<V...>> : std::true_type{};
这使用true_type
中的false_type
和type_traits
,因此我们不需要自己编写constexpr bool value
。我在这里使用了一个可变参数模板,因为它稍微更通用,只需要几个键击。对于您的特定用例,您不需要它们)