Templates 为什么可以';如果在专用参数上使用,是否启用_?
我正在尝试为整型创建一个局部专门化。我的想法是做一些类似的事情:Templates 为什么可以';如果在专用参数上使用,是否启用_?,templates,c++11,Templates,C++11,我正在尝试为整型创建一个局部专门化。我的想法是做一些类似的事情: #include <type_traits> template <typename T> struct Class { }; template <typename T> struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { }; #包括 模板 结构类{ }
#include <type_traits>
template <typename T>
struct Class {
};
template <typename T>
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
};
#包括
模板
结构类{
};
模板
结构类{
};
但是,这会导致以下错误:
error: template parameters not deducible in partial specialization:
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
^
note: 'T'
错误:部分专门化中无法推断模板参数:
结构类{
^
注:“T”
如果我使用了一个额外的模板参数,它就可以工作了:
#include <type_traits>
template <typename T, typename Enable = void>
struct Class {
};
template <typename T>
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> {
};
#包括
模板
结构类{
};
模板
结构类{
};
为什么我需要额外的模板参数?在第一种情况下,您没有专门化该类。 当你写作时:
template <typename T>
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
};
但是专门化不是也解决了类的问题吗?我不明白编译器是如何理解第二种情况的。你实际上不需要
Enable=void
,省去它,它也应该可以正常工作。template
应该做这个特技!现在我明白了!基本情况是类。专门化是类,所以模板参数现在E是专门化的。如果没有E,编译器会认为没有部分专门化(专门化的类型与基本情况相同)。感谢您对这一点的关注!
template <typename T>
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> {
};
template <>
struct Class<std::enable_if<std::is_integral<int>::value, int>::type> {
};