在 C++ 模板实例化期间获取原始 struct/class 名称

Obtain original struct/class name during C++ template instantiation

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 到 return true 而 xxx<s2, s3>::value 到 return false 在编译期间。

C++不可能存在xxx吗? 或者,xxx 理论上在 C++ 中是可能存在的,但可能还没有人这样做过?

使用两个使用模板模板参数的特化来执行这个"matching":

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)派生。以上只是我在 phone.

上做的快速模型

类似于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

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