在 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;
};
注意:要使其成为真实类型特征,您不应手动设置 value
,而应从 std::integral_constant
(std::true_type
或 std::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_type
和 false_type
,因此我们不需要自己编写 constexpr bool value
。我在这里使用了一个可变参数模板,因为它更通用一些,只需要多敲几次键。对于您的特定用例,您不需要它们)
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;
};
注意:要使其成为真实类型特征,您不应手动设置 value
,而应从 std::integral_constant
(std::true_type
或 std::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_type
和 false_type
,因此我们不需要自己编写 constexpr bool value
。我在这里使用了一个可变参数模板,因为它更通用一些,只需要多敲几次键。对于您的特定用例,您不需要它们)