0

指定されたクラスのメンバー関数だけでなく、任意のメンバー関数を指すことができる関数ポインターを定義するのが困難です。

たとえば、C++ では、メンバー関数への関数ポインターが指すクラスを指定する必要があります。

typedef void (Foo::*MyFunctionPointerTypeName)(int);

しかし、この関数ポインターが指すクラス メンバー関数が にない場合はどうなるFooでしょうか? では、これをどのように書くか、またはどの代替アプローチを使用できますか?


更新: C++ 11 でこれを達成する方法についての簡単な回答を探している人向け std::function(このテーマに関するチュートリアルは多くの読者を想定しているようです):

定義 (内からFoo):

std::function<void(int)> _fun;

バインディング (任意のクラスから):

objFoo->_fun = std::bind(&SomeOtherClass::memberFunction, 
    this, std::placeholders::_1);

それを呼び出す(内からFoo

if(_fun != nullptr) _fun(42);

関数にパラメーターがない場合は、 を削除できますstd::placeholders::_1。また、関数に 2 つのパラメーターがある場合は、パラメーターとしてにも追加する 必要があります。3 つのパラメーター、4 つのパラメーターなどについても同様です。std::placeholders::_2std::bind

4

2 に答える 2

1

継承を使用する:

#include <iostream>

struct Foo {};

struct Bar : public Foo
{
    int F0()
    {
        return 0;
    }
};

struct Baz : public Foo
{
    int F1()
    {
        return 1;
    }    
};

int main(int argc, char **argv)
{
    int (Bar::*pF0)() = &Bar::F0;
    int (Baz::*pF1)() = &Baz::F1;
    int (Foo::*pointer1)() = static_cast<int (Foo::*)()>(pF0);
    int (Foo::*pointer2)() = static_cast<int (Foo::*)()>(pF1);

    Bar r;
    Baz z;

    // Pointer to Foo member function calling Bar member function        
    std::cout << (r.*pointer1)() << '\n';
    // Pointer to Foo member function calling Baz member function
    std::cout << (z.*pointer2)() << '\n';

    return 0;
}

出力:

0
1

それが役に立てば幸い。

于 2013-01-14T10:25:54.990 に答える
1

任意のクラスのメンバーを指すメンバー ポインターを作成することはできません。覚えておいてください: メンバー ポインターの引数の 1 つは、クラス インスタンス自体です。また、ポインターは型付けされているため、その引数の型はポインターの型の一部です。

ただし、あらゆる種類の callable を格納できる を使用できます。std::function実際にどのように呼び出すか (つまり、どのパラメーターを指定するか) は、何をしようとしているのかを説明していないため、ニーズによって異なります。

于 2013-01-14T10:26:52.510 に答える