Listener
будет выведен компилятором как тип указателя на функцию, которую вы передаете ему, в этом случае void(const KeyboardEvent&)
.
И ваш тест не пройден, потому что все наоборот: вы хотите
if (!std::is_convertible<Listener, std::function<void (Event&)>>::value)
(обратите внимание на отрицание).
Кстати, и std::is_array
, и std::is_convertable
определяются во время компиляции, что означает, что вы используете среду выполненияпроверить на то, что определено статически.Вместо этого вы можете сделать так, чтобы шаблон не связывался с недопустимыми типами, используя SFINAE:
template<typename Event, typename Listener>
typename std::enable_if<!std::is_array<Event>::value && std::is_convertible<Listener, std::function<void(Event&)>>::value, bool>::type bindEvent (const Listener& function)
{
}
Это вызовет ошибку компилятора, если вы попытаетесь создать экземпляр шаблона с типами, которые не соответствуют вашим условиям.