5

私は、アリティ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。私はこれをマクロベースのソリューションで使用していますが、そのソリューションではタイプとパラメーター数を明示的に指定する必要があります。
関数のオーバーロード解決を介して、メンバー関数のシグネチャから暗黙的に正しい変換ファンクターを生成したいと考えています。

4

1 に答える 1

3

関数に渡されたポインターを非型のテンプレート引数に変換しようとしているように見えますが、うまくいかないのではないかと思います (質問へのコメントを参照してください)。

あなたができることは、関数ポインタを関数オブジェクトに格納することです。次のようにコンパイルされます。

#include <boost/bind.hpp>
#include <boost/function.hpp>

struct X {};

template <class T>
bool process(X) { return true; }


template <class C, class T1, class Func>
struct wrap1
{
    typedef bool result_type;
    Func f;

    wrap1(Func f): f(f) {}

    bool operator()(C* c, X x)
    {
        return (c->*f)(process<T1>(x));
    }
};

template<class C, typename T1>
inline // there are more for T1..TN
boost::function<bool (C*, X)> make_fn(bool (C::*f)(T1))
{
    return boost::bind(wrap1<C, T1, bool (C::*)(T1)>(f), _1, _2);
}


struct A
{
    bool f1(bool) { return true; }
};

void test()
{
    A a;
    X x;
    make_fn(&A::f1)(&a, x);
}

ただし、それが良いかどうか、残りのラッパーをどのように作成するかはわかりません。後者の場合、可変個引数テンプレートをサポートするコンパイラを入手するだけかもしれません。:)

于 2009-10-10T20:28:11.957 に答える