我有以下代码:
#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失败,我希望它能成功。我做错了什么?
答案 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;
// ^^^^^^^^^^^ ^