在C ++模板实例化期间获取原始结构/类名

时间:2017-05-28 19:47:58

标签: c++ template-meta-programming static-assert

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,但可能还没有人完成它?

2 个答案:

答案 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;
};

With your code on ideone

注意:要使其成为真实的类型特征,您不应手动设置value,而应来自std::integral_constantstd::true_typestd::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{};

Demo

这使用true_type中的false_typetype_traits,因此我们不需要自己编写constexpr bool value。我在这里使用了一个可变参数模板,因为它稍微更通用,只需要几个键击。对于您的特定用例,您不需要它们)