3

これが私のアプリケーションによって課される要件です。私はクラス A を持っています。これは、cFunc という関数ポインタを受け入れます。基本的に A の実装では、cFunc を複数回呼び出します。

cFunc ポインター自体は、アプリケーションに応じて異なる関数を指す必要があります。したがって、アプリケーションごとにcFuncと同じ関数定義を持つクラスを作成しますが、クラスのメンバー関数をこのポインターに割り当てることはできません

class A {
    typedef double (*Def_CFunc)(std::vector<double>);
    A(Def_CFunc _cFunc) { // Some implementation}
    // Other Functions
};

class B { double someFunc(std::vector<double> b); };
class C { double someOtherFunc(std::vector<double> a); };

int main () {
    B firstObj;
    C secondObj;

    // Depending upon the situation, I want to select class B or C
    double (*funcPointer)(std::vector<double>) = firstObj.someFunc; // Error in this line of code

    A finalObj(funcPointer);
}

では、指定された形式のメンバー関数を持つ任意のクラスを使用してクラス A を初期化できるようにするにはどうすればよいでしょうか?

4

4 に答える 4

2

要件が正確に何であるかはわかりませんが、インターフェイス(またはC ++用語の抽象基本クラス)が必要なようです。

とが両方とも共通の基本クラスから継承している場合はBCこの基本クラスへのポインターを渡して、その上で関数を呼び出すことができます。

class I { virtual double func(std::vector<double> a) = 0; }
class B : public I { double func(std::vector<double> a); };
class C : public I { double func(std::vector<double> a); };

I*にポインタを渡して、を使用することができAますi->func

于 2012-03-03T10:04:30.607 に答える
1

メンバー関数へのポインターは、通常の関数へのポインターとは構文が異なり、特定の1つのクラスのメソッドのみを指すことができます。異なるクラスのメソッドを指すことができるようにするには、boost :: functionを使用するか、C++11が使用可能な場合はstd::functionを使用します。これらは、特定の署名の任意のメソッドまたは機能を保持できます。

于 2012-03-03T10:01:26.717 に答える
1

必要なのは、またはラムダ式(または最初の2つに相当するBoost)とstd::function一緒にするstd::bindことです。これは、メンバー関数ポインターではそれができないためです。

于 2012-03-03T10:03:32.853 に答える
0

std::bind + std::function を使用して実行できます。任意の静的型を入力として受け取るテンプレート クラス ラッパーを作成してみましょう。次に、フリー関数 switch_obj でこのラッパーを使用します。使い方はとても簡単です。

typedef std::function<double(std::vector<double>)> my_foo;

template<class C>
struct switcher
{
    static my_foo convert(C* obj)
    {
        return my_foo( std::bind(&C::someFunc,obj,std::placeholders::_1) );
    }
};

template<class T>
my_foo switch_obj(T* obj)
{
    return switcher<T>::convert(obj);
}

void main()
{
    B firstObj;
    C secondObj;

    auto f =  switch_obj(&firstObj);
    A a(f);
}
于 2012-03-03T10:56:21.923 に答える