次のファンクターとその部分的な特殊化があります
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++ 環境で機能します。(関数がconstオブジェクトCaller<Foo>(&Foo::Bar)
でのみ呼び出されるため、私が g++ で文句を言うのは理にかなっています)。
ファンクターに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++ で const メンバー関数に対してファンクター テンプレートを機能させるにはどうすればよいですか?