Рассмотрим следующую шаблонную функцию-член:
template<typename E, typename N, typename P>
void Node::connectEvent( const bool( N::*fn )( const P& ), N *inst )
{
// Obtain unique event ID based on type.
size_t eventId = typeid( E ).hash_code();
// Actual code wraps the function returned from std::bind,
// but for this example let's assume we can store it directly.
mCallbacks[eventId] = std::bind( fn, inst, std::placeholders::_1 );
}
Я хотел бы иметь возможность вызывать эту функцию следующим образом:
connectEvent<MouseDownEvent>( &MyNode::mouseDown, this );
, где функция обратного вызова определяется как:
bool MyNode::mouseDown( const MouseDownEvent &event );
, или даже с использованием базового класса в качестве параметра, поэтому у меня есть отдельный тип события E и тип параметра P в шаблоне:
bool MyNode::mouseDown( const Event &event );
Мне также нужна поддержка для этого:
connectEvent<DrawEvent>( &MyNode::draw, this );
, где функция обратного вызова определяется как:
bool MyNode::draw();
Вопрос: для поддержки последнего я хочу специализировать функцию connectEvent
для случая, когда параметр P недействителен, поскольку для этого требуется другой вызов std::bind
. Я пробовал много разных подходов, в том числе использовал комбинацию enable_if
и is_void
в базовом шаблоне, но ни один из них не скомпилировался, поэтому я, должно быть, делаю что-то не так и прибегаю к методу проб и ошибок на этом этапе.
В большинстве случаев компилятор Visual Studio 2015 жалуется на «незаконное использование явных аргументов шаблона».
Вот версия кода, которая, как я думал, будет работать, но не сработала:
template<typename E, typename N>
void Node::connectEvent<E,N,void>( const bool( N::*fn )(void), N *inst )
{
size_t eventId = typeid( E ).hash_code();
mCallbacks[eventId] = std::bind( fn, inst );
}
Что я должен изменить в своем коде, чтобы это стало возможным?
const void &
является ошибкой. Это не дает вам пустой список параметров. - person T.C.   schedule 21.12.2015