2012-05-02 107 views
2

在C++中,它允許創建功能模板,會員及免費參數在模板函數的函數模板的顯式實例

template <void (*F)()> void function1(); 
template <void (MyClass::*M)()> void function2(); 

,並明確實例他們

function1 <&fn>(); 
function2 <&MyClass::doSomething>(); 

我的問題是,如果模板參數本身是從模板實例化的

template <typename R, typename C, R (C::*M)()> void function3(); 

我如何明確地實例化function3(如果可能的話)?

+0

你的意思是模板模板參數?您需要實例化模板參數並傳遞實例化類型。 – dirkgently

回答

2

只要做到:

function3<void, MyClass, &MyClass::doSomething>(); 

的語法就是在這種情況下,在其他情況相同。

完整的編譯例子:

#include <iostream> 
class MyClass { 
public: 
    void doSomething() { 
     std::cout << "doSomething\n"; 
    } 
}; 
void fn() { 
    std::cout << "fn\n"; 
} 
template <void (*F)()> void function1() { 
    F(); 
} 
template <void (MyClass::*M)()> void function2() { 
    (MyClass().*M)(); 
} 
template <typename R, typename C, R (C::*M)()> void function3() { 
    (C().*M)(); 
} 
int main() { 
    function1<&fn>(); 
    function2<&MyClass::doSomething>(); 
    function3<void, MyClass, &MyClass::doSomething>(); 
} 

打印:

fn 
doSomething 
doSomething 
+0

對,我不敢相信我錯過了。我不知何故,因爲'R'和'C'已經包含在'M'的類型中,所以我可以忽略它們。謝謝。 – larvyde

1
struct MyClass 
{ 
     int doSomething() { return 1; } 
}; 

template <typename R, typename C, R (C::*M)()> 
R function3(C* c) 
{ 
     return ((c->*M)()); 
} 

int main() 
{ 
     typedef decltype(MyClass().doSomething()) R_type; 
     MyClass cls; 
     function3<R_type, MyClass, &MyClass::doSomething>(&cls); // instantiation 
     return 0; 
}