2013-03-02 482 views
2

我有這樣的問題:函數模板參數和模板成員函數參數

template <void (*F)(int)> struct FunctionWrapper // This compiles and works 
{ 
    static void call_it() 
    { 
     F(0); 
    } 
}; 

class MyClass 
{ 
public: 
    static void callMe(int k) 
    { 
    } 
}; 

template <void (MyClass::*F)(int)> struct FunctionWrapper // Error - F incompatible with declaration 
{ 
    static void call_it() 
    { 
     MyClass::F(0); 
    } 
}; 

爲什麼我可以用一個函數指針(編譯時間常數),但不是一個班的成員(甚至是靜態的)嗎?

+0

你想用你的包裝達到什麼目的?你有沒有考慮過std :: function? – 2013-03-02 15:28:11

+0

我想在我的模板的參數列表中有一個類成員函數,有可能嗎? – 2013-03-02 15:44:55

回答

0

爲什麼我可以使用函數指針(編譯時間常量)而不是類成員(甚至靜態)?

您可以使用指向靜態函數的指針作爲常規函數指針。例如,下面的工作:

template <void (*F)(int)> struct FunctionWrapper 
{ 
    static void call_it() 
    { 
     F(0); 
    } 
}; 

class MyClass 
{ 
public: 
    static void callMe(int k) 
    { 
    } 
}; 

int main() 
{ 
    FunctionWrapper<&MyClass::callMe> obj; 
    obj.call_it(); 
} 

關於你的嘗試,這是款C++ 11標準規定的14.1/4:

非類型模板參數應有一以下的(任選CV修飾)類型:

- 積分或枚舉類型,

- 指向對象或函數指針

- 左值參考到對象或左值參照功能,

- 指針構件,

- 的std :: nullptr_t。

一個指向構件函數(即使static)不是用於非類型模板參數的選項。

+0

因此,類成員函數不是編譯時常量?怎麼來的?我認爲代碼是在所有類實例中共享的。也許我需要至少有一個類的實例來使這些代碼可用? – 2013-03-02 15:38:18

+0

我的意思是一個「非靜態」類成員函數 – 2013-03-02 16:13:01

+0

@PasterKeller:請參閱編輯我的答案。 – 2013-03-02 16:21:44

2

靜態函數具有與正常函數相同的類型簽名;它不是真正的會員功能。