#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <functional>
#include <type_traits>
struct X {};
struct Y {};
__int8 f(X x) { return 0; }
__int16 f(...) { return 0; }
template <typename T> typename std::enable_if<sizeof(f(T())) == sizeof(__int8), int>::type call(T const& t) {
std::cout << "In call with f available";
f(t);
return 0;
}
template <typename T> typename std::enable_if<sizeof(f(T())) == sizeof(__int16), int>::type call(T const& t) {
std::cout << "In call without f available";
return 0;
}
int main() {
Y y; X x;
call(y);
call(x);
}
这里似乎是一个非常简单的SFINAE使用,但编译器抛出一个错误,即它无法实例化enable_if< false,int> :: type.有什么建议?显然这段代码在GCC上编译得很好(没有问哪个版本).
编辑:此代码编译正常
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <functional>
#include <type_traits>
struct X {};
struct Y {};
__int8 f(X x) { return 0; }
__int16 f(...) { return 0; }
template<typename T> struct call_helper {
static const int size = sizeof(f(T()));
};
template <typename T> typename std::enable_if<call_helper<T>::size == sizeof(__int8), int>::type call(T const& t) {
std::cout << "In call with f available";
f(t);
return 0;
}
template <typename T> typename std::enable_if<call_helper<T>::size == sizeof(__int16), int>::type call(T const& t) {
std::cout << "In call without f available";
return 0;
}
int main() {
Y y; X x;
call(y);
call(x);
}
因此,我很高兴将这一个粉笔成为一个bugarooney.
最佳答案 这在VS2010中编译并正常工作.使用David的建议修改.
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <functional>
#include <type_traits>
struct X {
typedef X is_x;
};
struct Y {};
__int8 f(X x) { return 0; }
__int16 f(...) { return 0; }
template < class T >
struct test {
enum { result = sizeof(f(T())) };
};
template <typename T>
typename std::enable_if< test<T>::result == sizeof(__int8), int>::type call(T const& t) {
std::cout << "In call with f available" << std::endl;
f(t);
return 0;
}
template < typename T >
typename std::enable_if< test<T>::result == sizeof(__int16), int>::type call(T const& t) {
std::cout << "In call without f available" << std::endl;
return 0;
}
int main() {
Y y; X x;
call(y);
call(x);
}