2012-04-19 20 views
3

メンバ関数をテンプレート引数として使用する場合、Caller型を指定せずにテンプレート化する方法がありますか?メンバ関数ポインタをテンプレート引数として使用する場合の除算型

struct Foo 
{ 
    template <typename Caller, void (Caller::*Func)(int)> 
    void call(Caller * c) { (c->*Func)(6); } 
}; 

struct Bar 
{ 
    void start() 
    { 
     Foo f; 
     f.call<Bar, &Bar::printNumber>(this); 
       ^^^^ 
    } 

    void printNumber(int i) { std::cout << i; } 
}; 

int main() 
{ 
    Bar b; 
    b.start(); 
    return 0; 
} 

私は

template <void (Caller::*Func)(int), typename Caller> 
void call(Caller * c) { (c->*Func)(6); } 

を試してみて、私はCaller is not class...エラーを取得しています

f.call<&Bar::printNumber>(this); 

のようにそれを呼び出します。

したがって、コンパイラに呼び出し元のタイプを推測させる方法はありますか?

答えて

2

いいえ、あなたが望む通りではありません。

  1. メンバ関数へのポインタがパラメータではなく、テンプレートパラメータであればCallerを推定することができます。例:

    template <class Caller> 
    void call(Caller * c, void (Caller::*Func)(int)) { (c->*Func)(6); } 
    
  2. それが事前に知られていました。たとえば、次のようなコール表情を作ることができる:

    f.arg(this).call<&Bar::printNumber>(); 
    

    call機能は、次のようになります。

    template <class Arg> 
    struct Binder 
    { 
        template<void (Arg::*Func)(int)> 
        void operator()() const { 
        ... 
        } 
    }; 
    

    arg機能を書くのは簡単だろう(あなたの場合には、それが戻ってきますBinder<Bar>、ここでBarthisから推定されます)。

    IMHOはあまり便利ではありません。

+0

ありがとうございました!なぜ私は定期的なパラメータの代わりにそれをテンプル化しようとしたのかわからない:)もう一度ありがとう – relaxxx

関連する問題