为什么不能推断出静态成员函数是否存在

时间:2018-11-27 10:59:42

标签: c++ templates c++17

我有以下代码:

#include <utility>

template<class T,class E = void>
struct func_impl;

template<class T,class E = void>
constexpr inline bool has_func = false;

template<class T>
constexpr inline bool has_func<T,decltype(func_impl<T>::apply(std::declval<T>()))> = true;

template<>
struct func_impl<int>
{
   static int apply(int i);
};

static_assert(has_func<int>);

static_assert失败,我希望它能成功。我做错了什么?

1 个答案:

答案 0 :(得分:6)

问题在于第二个模板参数E的默认值来自主模板,它的值为void,与专业化中专门设计的模板参数不匹配;专用为decltype(func_impl<T>::apply(std::declval<T>()))(在这种情况下为int)。然后将选择主要模板而非专业化模板。

您可以使用std::void_t

template<class T>
constexpr inline bool has_func<T, std::void_t<decltype(func_impl<T>::apply(std::declval<T>()))>> = true;
//                                ^^^^^^^^^^^                                                 ^

LIVE