2

次のコードがあるとします。

class A
{
public:
    A() {}

    int f(void*, void*)
    {
        return 0;
    }
};

template <typename T>
class F {
public:
    F(int(T::*f)(void*,void*))
    {
        this->f = f;
    }

    int(T::*f)(void*,void*);

    int Call(T& t,void* a,void* b)
    {
        return (t.*f)(a,b);
    }
};

A a;
F<A> f(&A::f);
f.Call(a, 0, 0);

これは機能しますが、関数を簡単に呼び出すことができますが、たとえば、型を知らなくてもこれらの配列を取得するにはどうすればよいでしょうか?

任意のクラス f 関数をコールバックとして呼び出せるようにしたいと考えています。通常は静的関数または C 関数を使用して終了しますが、C++ メンバー関数の呼び出しを試してみたかったのです。

私が C# のデリゲートとしてやろうとしていることを考えてみてください。Boost やその他の場所で非常に洗練された実装を見てきましたが、最低限、コピー、作成、削除などを必要とせず、呼び出すことができる単純なコールバックだけが必要です。

これは夢物語ですか?アドバイスをいただければ幸いです。

4

2 に答える 2

4

std::functionandを使用std::bindして、コメントで述べたように、次のようなことができます。

#include <functional>

class A
{
public:
    A() {}

    int f(void*, void*)
    {
        return 0;
    }
};

class F {
public:
    F(std::function<int(void*, void*)>& func)
        : func_(func)
    { }

    std::function<int(void*, void*)>& func_

    int Call(void* a, void* b)
    {
        return func_(a, b);
    }
};

int main()
{
    using namespace std::placeholders; //for _1, _2, _3...

    A a;
    F f(std::bind(&A::f, a, _1, _2));

    f.Call(nullptr, nullptr);
}

これらの関数のベクトルを使用するには、単に例を使用します

std::vector<std::function<int(void*, void*)>> my_function_vector;

次に、ベクター内の各関数を呼び出すには、単純に繰り返します。

for (auto& f : my_function_vector)
{
    int result = f(some_pointer_1, some_pointer_2);
}

また、標準ライブラリに新しい C++11 機能がない場合は、 and を使用boost::bindboost::functionても同様に機能します。そして、代わりに昔ながらのイテレータ ループを使用して、ベクトルを反復処理します。

于 2013-05-02T16:50:41.620 に答える