模板元编程整体专业化

时间:2015-10-01 23:47:42

标签: c++ templates sfinae

我正在制作一个简单的max函数来在C ++中试验模板元编程。当我用int调用函数时,我希望看到“积分”显示但是它不是,我不知道为什么:

#include <iostream>

template<class...   > struct make_void { typedef void type; };
template<class... Ts> using void_t = typename make_void<Ts...>::type;

#include <type_traits>

template < class T, class = void_t < typename std::is_integral<T>::value > >
    T max(T x, T y) {
    std::cout << "integral" << std::endl;
    return x > y ? x : y;
}

template<class T, class = void>
    T max(const T& x, const T& y) {
    std::cout << "class" << std::endl;
    return x > y ? x : y;
}

int main() {
    int x = 5,y = 3;
    std::cout << "int: ";
    max(x,y);
    struct str{bool operator>(const str&other)const{return true;}} a, b;
    std::cout << "blank struct: ";
    max(a,b);
}

在这两种情况下,它打印出令我担心的课程,因为我认为SFINAE会更频繁地选择更好的选项。我不明白发生了什么。

1 个答案:

答案 0 :(得分:4)

std::is_integral<T>::value不是类型,所以

template < class T, class = void_t<typename std::is_integral<T>::value>>
T max(T x, T y)
SFPAE仍然拒绝

您可以使用std::enable_if_t

template<class T>
std::enable_if_t<std::is_integral<T>::value, T> max(const T& x, const T& y) {
    std::cout << "integral" << std::endl;
    return x > y ? x : y;
}

template<class T>
std::enable_if_t<!std::is_integral<T>::value, T> max(const T& x, const T& y) {
    std::cout << "class" << std::endl;
    return x > y ? x : y;
}

Demo