2012-05-02 3 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; 
}