2016-11-21 18 views
2

メンバ関数へのポインタであるメンバが必要です。次に、このポインタを他のメンバ関数の1つを指すように設定し、それを使って本当に必要な関数を呼び出します。基本的には、関数を実装するさまざまな方法があり、適切な関数を呼び出すポインタを設定したいと考えています。また、クラスはテンプレートクラスです。C++メンバ関数へのポインタ、メンバ

関数ポインタを介して関数を呼び出す方法が見つかりません。たとえば は:

template <typename T> class C 
{ 
public: 
    typedef void(C<T>::*Cfunc)(int); 
    Cfunc cf; 
    void p1(int i) { 
    } 
    C (int i) 
    { 
     cf = &C<T>::p1; 
    } 
}; 
int main() 
{ 
C<int> Try1(1); 
(Try1.*C<int>::cf)(10); 
return 0; 
} 

私はエラーを取得する:

tc.cpp: In function ‘int main()’: 
tc.cpp:5:11: error: invalid use of non-static data member ‘C<int>::cf’ 
    Cfunc cf; 
     ^
tc.cpp:16:16: error: from this location 
(Try1.*C<int>::cf)(10); 
+0

にアクセスするためにCのインスタンスが必要あなたは本当にメンバ変数へのポインタが必要ですか? std :: functionとlambdaの間にはほとんど必要はありません。 –

+0

私はstd :: functionまたはlambdasで私の問題を解決する方法を知らない。私が望むのは、私が使用したい実装セットのどれを構築するかを設定できることです。ポインタを変更することで、オブジェクトの存続中にこれを動的に変更できるようにすることもできます。だから私の例では時にはcfがp1を指し、時には実装p2を指すこともあります。私は、電話の時点でif-then-elseを持つ必要があるというトラブルやオーバーヘッドを望んでいません。 – KevinD

答えて

7

メンバ関数へのポインタは静的変数ではありませんので、あなたはそれを

int main() 
{ 
    C<int> Try1(1); 
    (Try1.*Try1.cf)(10); 
    return 0; 
} 
+0

素晴らしいありがとう。私はTry1を2度持っていなければならないことを理解していませんでした。 – KevinD

+0

@KevinD 'try 1'を' void wrap(){return(this - > * cf)(10);を宣言することで2回回避することができます。 }ポイントは、Try1を2回使用しています.1回はptmfを保持し、もう1回は*関数を呼び出す*ことがポイントです。 (そして、一般的なケースでは、それらのオブジェクトはしばしば同じではありません)。 –

+0

クール、感謝のマーティン。 – KevinD

関連する問題