Почему я не могу сделать вывод, если статическая функция-член существует - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть следующий код:

#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 голосов
/ 27 ноября 2018

Проблема в том, что значение по умолчанию для второго параметра шаблона 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...