具有以下模板和专门化:
template<typename T, typename = void>
struct A {
void operator()() {
std::cout << "primary" << std::endl;
}
};
template<typename T>
struct A<T, decltype(T().f())> {
void operator()() {
std::cout << "specialization" << std::endl;
}
};像这样使用:
struct X {
bool f() { return false; }
};
int main()
{
A<X>()();
return 0;
}当您期望选择部分专业化时,主模板将被解析。然而,当更改为:
template<typename T>
struct A<T, typename std::enable_if<std::is_object<decltype(T().f())>::value>::type> {
void operator()() {
std::cout << "specialization" << std::endl;
}
};选择专业化。为什么在最初的示例中没有选择专门化?
发布于 2018-09-27 20:54:56
您实例化了:
A<X>它利用默认模板参数成为:
A<X,void>然而,你的专长是:
template<typename T>
struct A<T, decltype(T().f())>对于模板参数X,它变成:
struct A<X, decltype(X().f())>即:
struct A<X, bool>因此,您的专门化不是正确的选择,因为A<X,bool>没有专门化A<X,void>。
如果您希望您的专门化工作于格式良好的T().f()实例,则可以使用C++17的std::void_t。
std::void_t将为void计算传递给它的任何格式良好的模板参数。
template<typename T>
struct A<T, std::void_t<decltype(T().f())>> {
void operator()() {
std::cout << "specialization" << std::endl;
}
};https://stackoverflow.com/questions/52544813
复制相似问题