C++ 检查类是否是模板专用化?
如何检查给定类型是否是特定类模板的专用化?例如,给定C++ 检查类是否是模板专用化?,c++,templates,C++,Templates,如何检查给定类型是否是特定类模板的专用化?例如,给定 template <class T> struct A {}; 例如,此处A应匹配A并打印1。CompareT是一个类型,A是一个模板。类不能是相同的模板。类可以是模板的专门化,所以我假设这就是您想要的 部分专门化可以进行模式匹配: template<class T> struct is_an_A // Default case, no pattern match : std::false_type {};
template <class T>
struct A {};
例如,此处
A
应匹配A
并打印1。CompareT
是一个类型,A
是一个模板。类不能是相同的模板。类可以是模板的专门化,所以我假设这就是您想要的
部分专门化可以进行模式匹配:
template<class T>
struct is_an_A // Default case, no pattern match
: std::false_type {};
template<class T>
struct is_an_A< A< T > > // For types matching the pattern A<T>
: std::true_type {};
template< class CompareT >
void compare() {
std::cout << is_an_A< CompareT >::value;
}
模板
struct是默认情况,没有模式匹配
:std::false_type{};
模板
struct是与模式A匹配的类型的
:std::true_type{};
模板
void compare(){
std::cout::value;
}
在这里,您可以提供要匹配的模板:
template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};
template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};
static_assert(is_specialization<std::vector<int>, std::vector>{}, "");
static_assert(!is_specialization<std::vector<int>, std::list>{}, "");
模板
结构是_专门化:std::false_类型{};
模板
结构是_专门化:std::true_类型{};
静态_断言(是_专门化{},”);
静态_断言(!is_专门化{},”);
?@quantdev是的,但我需要的是与此案例相同的:)“这是A吗?”是什么?你在比较什么?也许你的意思是:类型CompareT
是类型模板A
的一个实例吗?是否有一些X
(任何X
)的A
是CompareT
?@AaronMcDaid(和tower120)实例化模板意味着通过插入每个模板参数的参数来生成最终类型(专门化)。类型的实现是通过匹配其“签名”的模式来选择的,所选的实现可以是显式的(如std::vector
)或隐式的(从第一个也是最一般的声明中)专门化。我们进一步区分部分显式专门化和完全显式专门化,这取决于是否还有模板参数。请注意,这不适用于所有模板,例如问题中提到的std::array
,它实际上是作为@Potatoswatter的副本关闭的。非类型模板参数仍然是不可容忍的,在C++ 17中有“自动”模板参数的可能的解决方法吗?我尝试没有成功,但我仍然不是一个C++模板的大师……尼科伯罗格里有点。code>auto可用于推断非类型模板参数的类型,因此std::array
可与模板结构匹配。但是,类型参数和非类型参数仍然不兼容,您需要生成大量这些排列以覆盖所有(合理的)情况。名称是\u专门化
是误导性的,因为专门化意味着针对特定类型的模板的替代实现。在我看来,最好使用是的实例或是的模板。
template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};
template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};
static_assert(is_specialization<std::vector<int>, std::vector>{}, "");
static_assert(!is_specialization<std::vector<int>, std::list>{}, "");