Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查类是否是模板专用化?_C++_Templates - Fatal编程技术网

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>{}, "");