2013-08-04 9 views
1

같은 코드를 고려하시기 바랍니다 함수 포인터에 대한 포인터와 멤버 포인터를 가입?

가능한 경우, 어떻게 든 void (*)(int)MyClass*void (Myclass::*)(int)에 가입 싶어요.

그렇지 않은 경우, std::mem_fnstd::function (또는 다른 기능 유틸리티)의 영리한 사용이 트릭을 수행 할 것으로 예상됩니다.

이상적으로는 C++ 11 솔루션을 원합니다 (예 : std::mem_fun은 현재 사용되지 않음).

답변

2

당신은 일반 함수 포인터를 얻을 수 없다,하지만 당신은 bind 또는 람다를 사용하여 함수 객체를 얻을 수 있습니다 :

auto bound = std::bind(member_func_ptr, class_ptr, std::placeholders::_1); 
auto lambda = [=](int x){return (class_ptr->*member_func_ptr)(x);} 

bound(5); // should output 5 
lambda(5); // should output 5 too 

이 두 std::function<void(int)>로 변환 할 수 있습니다 당신이 원하는 경우.

1

멤버 포인터와 개체 포인터에서 함수 포인터를 만들 수 없습니다.

std::bind(member_func_ptr, class_ptr, _1) 

당신은이 기능을 사용하여 객체를 초기화 할 수 있습니다, 예를 들어, std::function<void(int)> : 당신이 얻을 수있는 것은 사용하여 동일한 통화 표기, 예를 들어, std::bind()와 함수 객체입니다.