【发布时间】:2016-02-09 17:21:05
【问题描述】:
让我们来个简单的sn-p:
template<class T, class... Args>
struct A {
void operator()() { std::cout << "A"; }
};
template<class T, class... Args>
struct A<T, double, Args...> {
void operator()() { std::cout << "B"; }
};
template<class T, class B, class... Args>
struct A<T, B, double, Args...> {
void operator()() { std::cout << "C"; }
};
我可以这样使用:
int main() {
A<int, int, int> a;
A<int, double, int> b;
A<int, int, double> c;
a(); b(); c();
return 0;
}
它正确返回"ABC"。但是当我声明 A<int, double, double> d; 时,我显然得到了编译时错误 ambiguous class template instantiation for struct A<int, double, double>。
问题是:我可以做一些技巧(可能使用 SFINAE)来考虑第二个模板参数,因为它将具有更高的优先级并且会使用返回 B 的专业化? (忽略第三位的double)
注意:double 和 int 类型用于简化示例,我将使用类型特征。因此,我想避免将专业化作为解决方案:
template<class T, class... Args>
struct A<T, double, double, Args...> {
void operator()() { std::cout << "D"; }
};
【问题讨论】:
标签: c++11 variadic-templates specialization