模板元编程积分特化
Template meta programming integral specialization
我正在制作一个简单的 max
函数来试验 C++ 中的模板元编程。当我用 int 调用函数时,我希望看到 "integral" 显示,但事实并非如此,我也不知道为什么:
#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);
}
在这两种情况下它都打印出 class 这让我很担心,因为我认为 SFINAE 会更频繁地 select 更好的选择。我不明白发生了什么。
std::is_integral<T>::value
不是类型,所以
template < class T, class = void_t<typename std::is_integral<T>::value>>
T max(T x, T y)
仍然被 SFINAE 拒绝。
您可以使用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;
}
我正在制作一个简单的 max
函数来试验 C++ 中的模板元编程。当我用 int 调用函数时,我希望看到 "integral" 显示,但事实并非如此,我也不知道为什么:
#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);
}
在这两种情况下它都打印出 class 这让我很担心,因为我认为 SFINAE 会更频繁地 select 更好的选择。我不明白发生了什么。
std::is_integral<T>::value
不是类型,所以
template < class T, class = void_t<typename std::is_integral<T>::value>>
T max(T x, T y)
仍然被 SFINAE 拒绝。
您可以使用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;
}