2013-01-05 11 views
1

템플릿 매개 변수로 템플릿 멤버 함수를 사용하려고합니다. 호출에템플릿 매개 변수로 템플릿 멤버 함수 포인터

Invoke<&A::Foo>(5, true); 

그리고이 유사 할 수 있습니다 : 내가 좋아하는 것

class A 
{ 
public: 
    template<typename... Args> 
    void Foo(Args...) {} 

    void Bar() {} 
}; 

호출 할 수 있도록 :

A a; 
a.Foo(5, true); 

I이 클래스 주어진 예를 들어

, 이 작업을 수행하는 방법을 알고 Bar() :

template<void (A::*F)()> 
void Invoke() 
{ 
    A a; 
    (a.*F)(); 
} 

int main() 
{ 
    Invoke<&A::Bar>(); 
} 

이 템플릿을 템플릿 함수 포인터로 확장 할 수 있습니까? 또는 이와 유사하게 모든 매개 변수 유형을 가진 함수를 처리 할 수있는 이와 같은 전달 함수를 작성하십시오. 이것은 작동하지만 뭔가 비슷한을하지 않습니다이 가능하지 않을 이유

template<typename... Args, void (A::*F)(Args...)> 
void Invoke(Args... args) 
{ 
    A a; 
    (a.*F)(args...); 
} 

내가 볼 수 있지만, 사실이라면 그 이유에 대한 표준을 가리 수 있을까? 나는 또한 표준의 특성에 대해 더 많은 것을 배우려고 노력하고있다.

+0

시도'호출 <& A :: 푸 > (5 사실)': 다음, 당신은 실제 함수를 호출하는 호출 객체를 정의해야합니다. 그게 작동한다면, type-deducing wrapper * function * 템플릿을 작성하십시오. –

+0

@KerrekSB하지만 멤버 함수 포인터 유형을 지정할 때 매개 변수를 지정해야하기 때문에 Invoke가이 시그니처가있는 함수를 받아 들여야한다고 (함수를 코딩하지 않고) 함수 유형을 지정하는 방법을 모르겠습니다. – JaredC

+0

글쎄, 당신은'Invoke'를보다 강력한 템플릿으로 만들 수 있습니다 ... –

답변

2

이 템플릿을 템플릿 함수 포인터로 확장 할 수 있습니까?

아니요. Foo이라는 특정 인스턴스가 필요하면 Invoke<&A::Foo<int, bool>>을 사용할 수 있습니다.

또는 이와 비슷하게 모든 매개 변수 유형의 함수를 처리 할 수있는 이와 같은 전달 함수를 작성합니다.

하는 다른 서명 작업을 할 수 있으려면, 당신은 호출 모든 종류의 객체에서 작동하도록 Invoke을 수정해야합니다.

struct callable_foo 
{ 
    explicit callable_foo(A& obj) : _obj(obj){} 

    template< typename ...Args > 
    void operator()(Args&&... args) 
    { 
     _obj.Foo(std::forward<Args>(args)...); 
    } 

    A& _obj; 
} 
+0

'std :: forward (args)'대신'std :: forward (args) ...'를 의미합니까? – Nawaz

+0

@Nawaz : 네, 고마워요. _perfect 포워딩으로 아직 따라 잡기 _ –

관련 문제