私は、アリティnmake_fn()
のメンバー関数のパラメーターを(経由して)前処理するファンクターの生成を(経由して)単純化しようとしています。
ファンクターの生成は基本的に機能しますが、これまではメンバー関数のパラメーター型を明示的に指定することによってのみ機能していました。
次に、処理するメンバー関数型から正しいファンクターを生成したいと思います。wrap()
struct X {};
template<class C, typename T1, bool (C::*F)(T1)>
inline // there are more for T1..TN
bool wrap(C* c, X x)
{
return (c->*F)(process<T1>(x));
}
template<class C, typename T1, bool (C::*F)(T1)>
inline // there are more for T1..TN
boost::function<bool (C*, X)> make_fn(F f) // <- problem here, F is not a type
{
return boost::bind(&wrap<C, T1, F>, _1, _2);
}
F
ただし、これにより、vc++およびg++はのパラメーターの型として認識されませんmake_fn()
。私はここで明白な何かを見逃さなければならず、やや盲目だと感じています。
アイデアは、次のように機能する必要があるというものでした。
struct A
{
bool f1(bool) { return true; }
};
void test()
{
A a;
X x;
make_fn(&A::f1)(&a, x);
}
それを機能させる方法について何かアイデアはありますか?
背景:
単純化すると、次のような固定インターフェースがあります。
bool invoke(C* c, const char* const functionName, int argCount, X* args);
Xは、特定のバックエンド型(int、std :: string、...)に変換する必要があるバリアント型です。
これらの呼び出しを処理するために、名前で検索されるファンクターのマップがあり、これらの呼び出しをいくつかのインスタンスのメンバー関数にマップします。
ラッピングの目的は、手動変換を回避し、代わりに私またはの変換を行うファンクターを生成することですthrow
。私はこれをマクロベースのソリューションで使用していますが、そのソリューションではタイプとパラメーター数を明示的に指定する必要があります。
関数のオーバーロード解決を介して、メンバー関数のシグネチャから暗黙的に正しい変換ファンクターを生成したいと考えています。