起初我使用 enable_if ,我在下面写的代码不会编译,但它在逻辑上似乎是正确的,但不会被当前的 enable_if 实现支持。
1
2 #include <iostream>
3 using namespace std;
4
5 template<int N>
6 struct S{
7 template<class T>
8 typename enable_if<N==1,T>::type
9 f(T t) {return 1;};
10
11 template<class T>
12 T
13 f(T t) {return 0;};
14 };
15
16 int main() {
17 S<1> s1;
18 S<2> s2;
19 cout << s1.f(99) <<" "<< s2.f(99) << endl;
20 return 0;
21 }
错误信息准确,问题准确指出。
enable_if.cc19:20: error: call of overloaded ‘f(int)’ is ambiguous
enable_if.cc:9:3: error: no type named ‘type’ in
‘struct std::enable_if<false, int>’
这似乎只是设计不明确的问题,很容易纠正。为了处理它,我可以编写部分专门的类模板:
#include <iostream>
using namespace std;
template<int N> struct S{
template<class T>
T
f(T t) {return 0;};
};
template<> struct S<1>{
template<class T>
T
f(T t) {return 1;};
};
int main() {
S<1> s1;
S<2> s2;
cout << s1.f(99) <<" "<< s2.f(99) << endl;
return 0;
}
但是为了清洁和方便,首先要增强 enable_if 模板以支持错误代码催生的这些新功能呢?
- 调用 f时
s1
,可以使用例子中返回 1 的更专业的那个。 - 调用 f时
s2
,将使用返回 0 的通用函数,即使第一个失败。