2012-05-02 31 views
2

++ 明示的なインスタンス

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; 
} 
関連する問題