我正在尝试使用以下构造检查基于以前获得的this answer的成员函数的存在:
template <typename T, class = double>
struct has_a : std::false_type {};
template <typename T>
struct has_a<T, decltype(std::declval<T>().a())> : std::true_type {};
在gcc 4.9.2上可以正常工作,但在msvc2013下无法编译:
似乎(?)这是一个编译器错误,因为
declval
特别应在未评估的decltype
表达式(see here)中工作。有已知的解决方法吗? 最佳答案
MSVC 2013的尾随返回类型解析器似乎比表达式SFINAE系统更完整,并且如果以以下方式重构检查器(following T.C's suggestion),则它可以在msvc2013和gcc 4.9.2上按预期工作:
template <typename T>
struct has_a_impl
{
template<typename U>
static auto test(U* p) -> decltype(p->a()); // checks function existence
template<typename U>
static auto test(...) -> std::false_type;
using type = typename std::is_floating_point<decltype(test<T>(0))>::type; // checks return type is some kind of floating point
};
template <typename T>
struct has_a : has_a_impl<T>::type {};
这种语法的另一个好处是,返回类型检查可以使用任何
type_traits
,因此您不必检查一种返回值的类型(例如, double )。关于c++ - msvc2013的decltype模板出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34595072/