У меня есть следующий функтор и его частичная специализация
template <class _T, typename _Return = void, typename _Arg = void>
struct Caller
{
typedef _Return(_T::*Method)(_Arg);
Caller(Method pm, _Arg a)
: _pMethod(pm),
_arg(a)
{}
_Return operator()(_T& obj)
{
return (obj.*_pMethod)(_arg);
}
Method _pMethod;
_Arg _arg;
};
template <class _T, typename _Return>
struct Caller<_T, _Return, void>
{
typedef _Return(_T::*Method)();
Caller(Method pm)
: _pMethod(pm)
{}
_Return operator()(_T& obj)
{
return (obj.*_pMethod)();
}
Method _pMethod;
};
Я пытаюсь использовать его следующим образом:
struct Foo
{
void Bar() const
{
void(0);
}
};
// ...
std::list<Foo> foos;
const std::list<Foo> &rFoos(foos);
std::for_each(rFoos.begin(), rFoos.end(), Caller<const Foo>(&Foo::Bar));
Я получаю это для последней строки кода (среда IDE принимает вызов от вызывающего абонента):
ошибка C2440: '': невозможно преобразовать из 'void (__thiscall Foo::*)(void) const' в 'Caller‹_T>' 1> с 1> [ 1> _T=const Foo 1> ] 1> Ни один конструктор не может взять исходный тип, или разрешение перегрузки конструктора было неоднозначным
Этот код будет работать в среде g++. (Если бы я Caller<Foo>(&Foo::Bar)
g++ жаловался, что имеет смысл, так как функция будет вызываться только для объекта const).
Я пробовал разные вещи, в том числе добавлял в функтор разновидности operator()(const _T& obj)
/operator()(const _T& obj) const
, но безрезультатно.
Это будет принято компилятором:
struct Foo
{
void Bar()
{
void(0);
}
};
// ...
std::list<Foo> foos;
const std::list<Foo> &rFoos(foos);
std::for_each(rFoos.begin(), rFoos.end(), Caller<Foo>(&Foo::Bar));
Что я делаю неправильно? Как заставить шаблон функтора работать с константными функциями-членами в Visual C++?