何时使用非模板功能和模板专用功能

时间:2017-03-12 05:53:54

标签: c++ templates template-specialization

我试图理解模板专业化。以下代码打印" 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;
}

0 个答案:

没有答案