2010-02-01 7 views
3

부스트를 사용하지 않고 템플릿 매개 변수로 전달하여 멤버 함수를 호출하고 싶습니다. 여기에 내가 시도한 것을 보여주는 예가있다.객체에 C++ 멤버 함수가 적용됨

class object { void method(); } 

{ 
object object_instance; 
... 
apply<object:: method>(); 
... 

template<class F> 
void apply() { F(object_instance); } // want to call object_instance.F() 
} 

작동하지 않는다. 그렇다면 객체 메서드를 객체에 바인딩하는 방법은 무엇인가? 감사합니다.

위의 예는 실제 코드가 아닙니다. 이름 만 다르지만 많은 매개 변수가있는 여러 함수가있어서 연산자에서 랩핑하려고합니다.

답변

5

뭔가 :

struct foo 
{ 
    void bar(void) {} 
}; 

template <typename R, typename C> 
R apply(C& pObject, R (C::*pFunc)()) 
{ 
    return (pObject.*pFunc)(); 
} 

int main(void) 
{ 
    foo f; 
    apply(f, &foo::bar); 
} 

이.

+0

덕분에, 나는 그 일을하려고했다. 나는. * 연산자에 대해 읽었지만 실제로 사용하는 것은 이번이 처음이다 – Anycorn

+0

문제 없습니다. 매개 변수 전달을 허용하기 위해 다양한 변형을 생성하거나 직접 작성해야합니다. 부스트. 프리 프로세서가 여기에서 도움이 될 것입니다. (부스트를 사용하고 있다면'boost :: bind'를 사용합니다.) 부스트를 사용하고 있지 않습니다 : P) – GManNickG

+0

실제로 인수는 적용 함수 내부에 적용되므로 동일하게 적용됩니다. 아마도 실제 코드를 제공했을 것입니다. 다시 한 번 감사드립니다 – Anycorn

0

멤버 함수는 형식 또는 정수 값이 아니므로 템플릿 매개 변수로 전달할 수 없습니다. 당신은 멤버 함수를 호출하는 구조체를 생성함으로써 원하는 것을 할 수 있습니다.하지만 템플릿의 object_instance가 오히려 냄새가납니다.

실제로 무엇을하려고합니까? 같은

0

이 예제는 C++ ox의 rvalue 참조입니다. 모든 컴파일러에서 작동하지 않습니다.

class Sample 
{ 
public: 
    void fun() { cout << "Sample::fun\n"; } 
}; 

template<typename Function> 
void FunCall(Function&& f) 
{ 
    f(); 
} 

void RvaluesDemo() 
{ 
    FunCall([&] 
    { 
     Sample().fun(); 
    }); 
} 
+0

downvote의 이유는 무엇입니까? – Jagannath

+0

나는 그저 추측하고있는 것이 아니기 때문에 질문에 C++ 0x 태그가 붙지 않았기 때문일 것이다. – GManNickG

+0

@GMan : 문제 없습니다. 그러나 매개 변수 전달을 허용하기 위해 다양한 변형을 작성하는 것보다 훨씬 유연합니다. – Jagannath

1

이것은 당신의 코드와 유사하고, 템플릿 매개 변수로 멤버 함수를 통과 수 :

class object { public: void method() {} }; 
object object_instance; 

template<void (object::*F)()> 
void apply() { 
    (object_instance.*F)(); 
} 

int main() { 
    apply<&object::method>(); 
    return 0; 
} 
+0

이 메서드는 항상 개체의 동일한 인스턴스에 대해 호출되는 문제가 아니겠습니까? – Narfanator

+0

네,하지만 그게 원래 코드가하는 것처럼 보였습니다. 그래서 저는 그것을 그대로 유지했습니다. 인스턴스를 대신 적용 할 매개 변수로 전달할 수 있습니다. – interjay

관련 문제