Маленький и очень скромный шаблон:
template< class Delegate, class Arg, class Result >
class closure_t :
public std::unary_function< Arg, Result >
{
private:
Delegate& _d;
Result (Delegate::*_f)(Arg);
public:
explicit closure_t(Delegate& d, Result (Delegate::*f)(Arg)) :
_d(d), _f(f)
{}
Result operator()(Arg x) const
{
return (_d.*_f)(x);
}
};
... со вспомогательной функцией:
template< class Delegate, class Arg, class Result >
closure_t< Delegate, Arg, Result > closure(Delegate& d, Result (Delegate::*f)(Arg))
{
return closure_t< Delegate, Arg, Result >(d, f);
}
При попытке использования при Result = void, компилятор
(MSVC++ 6.0) ругается на
return в
closure_t::
operator()().
В связи с этим,
Вопрос 1: Он правильно ругается? Ведь (
_d.
_f)(
x) имеет тип
void, и, как мне раньше казалось, такая конструкция допустима. И как тогда работают
std::
mem_fun_t и прочие, если тип адаптируемой функции
void?
Далее, пытаясь обойти сие, тщусь написать специализацию:
template< class Delegate, class Arg >
class closure_t< Delegate, Arg, void > :
public std::unary_function< Arg, void >
{
private:
Delegate& _d;
void (Delegate::*_f)(Arg);
public:
explicit closure_t(Delegate& d, void (Delegate::*f)(Arg)) :
_d(d), _f(f)
{}
void operator()(Arg x) const
{
(_d.*_f)(x);
}
};
Компилятор мне на это отвечает:
error C2989: 'closure_t<Delegate,Arg,void>' : template class has already been defined as a non-template class
error C2988: unrecognizable template declaration/definition
Вопрос 2: Что не так в этой специализации?
PS: К сожалению, образцов типа boost под рукою нет.