我正在尝试使用以下构造检查基于以前获得的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/

10-11 18:42