8

私が指摘したいかもしれないこれらの3つの異なる機能があるとしましょう:

float test1(int a, int b) {
    return 7.0f;
}

struct TestClass {
    float test2(int a, int b) {
        return 5.0f;
    }
};

struct TestClass2 {
    float  test3(int a, int b) {
        return 3.0f;
    }
};

3 つすべてが同じ引数と戻り値を使用していることに注目してください。それがメンバー関数であるかどうか、およびそれがどのクラスに属しているかを抽象化したいと思います。初期化方法のみに応じて、これら 3 つの関数のいずれかを参照できるデリゲート型が必要です。

これが私の最初の試みです:

typedef std::function<float(int, int)> MyDelegate; // is this right?

int main() {
    TestClass obj; 
    TestClass2 obj2;

    MyDelegate a = test1;
    MyDelegate b = std::bind(std::mem_fn(&TestClass::test2), obj); // is this right?
    MyDelegate c = std::bind(std::mem_fn(&TestClass2::test3), obj2); // is this right?

    return 0;
}

アイデアは、「this」ポインターもラッパー内に保存したいということです。このように、完全に機能するデリゲートのようになります。たとえば、'b(x, y)' の呼び出しは、obj.test2(x, y).

私はそれをコンパイルすることさえできません。おそらくこれを完全に把握していません。私はこれらのライブラリに慣れていないので、VS2012 のエラーは壊滅的に役に立ちません。どんな助けでも大歓迎です。

4

3 に答える 3

11

std::bind他の関数パラメーターをどうするかを指定する必要があります。呼び出しをb(x, y)委任xし、元の 2 つの関数パラメーターにするには、名前空間yのプレースホルダーを使用する必要があります。std::placeholders

std::bind(&TestClass::test2, obj, std::placeholders::_1, std::placeholders::_2);

また、メンバー関数を既に正しく処理している (暗黙の引数を明示的な最初の引数にするstd::mem_fn)ため、必要もありません (動作します)。std::bindthisstd::mem_fn

于 2012-09-13T10:48:22.017 に答える
4

std::bind に 2 つの引数を提供するか、後でそれらを提供するためにプレースホルダーを提供する必要があります。

std::function<float(int, int)> c = std::bind(&TestClass2::test3, obj2, 1, 2);
c(); //returns result

また

std::function<float(int, int)> c = std::bind(&TestClass2::test3, obj2, std::placeholders::_1, std::placeholders::_2);
c(1, 2); //returns result

std::bind の詳細については、こちらを参照してください。

于 2012-09-13T10:29:25.850 に答える
2

ビジュアル C++ コンパイラ (CTP 2012) を使用して、std::function の実行方法を調べ、メンバー関数を処理する独自のソリューションを提供しました。

使用方法は次のようになります: http://ideone.com/v5zfDn

class Window
{
public:
    void Show( int number ) const
    {
        //...
    }

    void ShowDynamic( int number ) volatile
    {
        //...
    }
};

void ShowWindows( int param )
{
    //...
}

int main()
{
    Window window;

    typedef mezutils::Delegate< void( int ) > Notifier;
    Notifier notifier;

    notifier = &ShowWindows;
    notifier( 0 );

    notifier = Notifier( &window, &Window::Show );
    notifier( 1 );

    notifier = [](int x) { /*...*/ };
    notifier( 2 );

    void (*funpc)(int) = func;
    notifier = funpc;
    notifier( 3 );

    notifier = [](int arg) { printf("asd %d\r\n",arg); };
    notifier(4);
    return 0;
}

デリゲート クラスは次のようになります: http://ideone.com/DebQgR

もちろん楽しみで作った試作品ですが、分かりやすいので気に入っています

于 2013-09-30T18:54:13.973 に答える