我试图理解模板专业化。以下代码打印" base 1 bas2"。如果我取消注释第(a)行,即将is_odd(bool)作为bool的模板特化,我仍然得到相同的输出。我的问题是我什么时候应该使用非模板功能/功能模板专业化?
#include <iostream>
#include <type_traits>
struct util {
public:
template <class T>
typename std::enable_if<std::is_integral<T>::value,bool>::type
is_odd (T i);
template <class T>
typename std::enable_if<!std::is_integral<T>::value,bool>::type
is_odd (T i);
//bool is_odd (bool);
template <class T>
T is_oddImpl (T i);
};
template <class T>
T util::is_oddImpl (T i) {
return is_odd(i);
}
template <class T>
typename std::enable_if<std::is_integral<T>::value,bool>::type
util::is_odd (T i) {std::cout << "base1\n"; T t; return t;}
template <class T>
typename std::enable_if<!std::is_integral<T>::value,bool>::type
util::is_odd (T i) {std::cout << "base1\n"; T t; return t;}
//template <> //line (a)
bool util::is_odd (bool) {std::cout << "base3\n";return true;}
int main() {
short int i = 1;
bool b;
ss test;
struct util s;
s.is_oddImpl(i);
s.is_oddImpl(b);
return 0;
}