2011-09-21 13 views
0

関数ポインターを含むテンプレートを引数として使用する方法を知りました。関数ポインター引数を持つテンプレートを使用する

void function(int,int); 
void class::function(int,int); 

:私のような2つの関数の関数ポインタに差の問題を回避するために、これを使用したいTは、関数ポインタ(例えばvoid (*)(int,int*,double)

である。例えば、

template<typename T> someFunction(T /*?*/) {} 

したがって、関数ポインタが機能しない場合、別の方法がありますか?

編集:基本的には、(通常のテンプレート関数がさまざまな変数を受け入れるように)テンプレートを使用してさまざまな関数を受け入れる関数を作成する必要があります。

+1

です。「違いをバイパスする」ことはできません。メンバ関数は、付随するインスタンスなしでは意味をなさない。また、 'class'はC++の予約語です。 –

答えて

0

メンバーの関数ポインタは、関数ポインタとは異なる獣です。例えば、それらのために追加のthis引数があります。 Boost.Function/Bindのように聞こえるのは、あなたが達成しようとしていることが完全にはっきりしていません。 TR1以降は標準であることに注意してください。

0

メンバ関数へのポインタの代わりにファンクタを使用することができます。例:私はこのコードをテストしていないため、いくつかの変更は、それをコンパイルするために取得するために必要な場合があり

class SomeFunctor { 
public: 
    void operator()(int i, int* ip, double d) 
    { 
    } 
}; 

void someFunction(int i, int* ip, double d) 
{ 
} 

template<typename T> 
void doSomething(T f) 
{ 
    int i = 0, j = 0; 
    int* ip = &j; 
    double d; 

    f(i, ip, d); 
} 

SomeFunctor someFunctor; 
doSomething(someFunctor); 
doSomething(someFunction); 

注意。

0

std :: functionを見てください。それはあなたが呼ぶことができるものである "ファンクタ"を保持する一般的な方法です。 (1つの種類のファンクタの例については、npclaudiuの応答を参照してください)

つまり、K-balloは正しいです。メンバ関数はオブジェクトを必要とするため、フリー関数とは異なります。 これは、通常、隠しパラメータを渡すことによって実装されます。あなたはそれを "this"と呼ぶことができます。その場でファンクタを作成するために - あなたは、データと機能を関連付けるためにはstd ::バインドを使用することができます

は、だから、void my_class::function(int,int);

書く場合、コンパイラは本当にvoid my_class::function (my_class*,int,int);

生成します。 私が知っている最高のチュートリアルは、Boost.Bind

関連する問題