2012-04-19 205 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); } 

,並調用它像

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

我得到Caller is not class...錯誤。

那麼,有沒有辦法讓編譯器推斷出來電類型?

回答

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推導)。

    不是很方便,恕我直言。

+0

非常感謝!我甚至不知道爲什麼我會嘗試將它代替常規參數進行構造:)再次感謝您 – relaxxx 2012-04-19 16:41:14