首页 > 解决方案 > 静态成员函数是否存在,为什么不能推断

问题描述

我有以下代码:

#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 失败,我预计它会成功。我做错什么了?

标签: c++templatesc++17

解决方案


问题是第二个模板参数的默认值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;
//                                ^^^^^^^^^^^                                                 ^

居住


推荐阅读