【发布时间】:2018-09-27 20:39:59
【问题描述】:
使用以下模板和专业化:
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;
}
};
选择专业。为什么原始示例中没有选择专业化?
【问题讨论】:
-
@Rakete1111 我不认为这是重复的。该副本描述了一个格式错误的模板参数。这个问题涉及一个格式良好的专业化,它根本不专门化测试的使用。
-
在我的“重新开放”投票之前等待看到“重新开放”投票或反驳...
-
@DrewDormann 无论如何这都没关系,但事实并非如此。副本提到了两者,并询问为什么没有为
int选择专业化。在这里,这是同一个问题:为什么即使表达式对给定类型有效,也没有选择特化。 -
为了记录,this 是声称的副本。我会让群众决定,而不是试图客观。干杯!
标签: c++ templates sfinae template-specialization