C++ 0x 기능 중 일부를 이해하기위한 개인적인 실험 중 하나 : 실행할 함수 파일 포인터에 함수 포인터를 전달하려고합니다. 결국 실행은 다른 스레드에서 발생합니다. 그러나 모든 다른 유형의 기능을 사용하면 템플릿을 사용할 수 없습니다.템플릿, 함수 포인터 및 C++ 0x
#include <functional>
int foo(void) {return 2;}
class bar {
public:
int operator() (void) {return 4;};
int something(int a) {return a;};
};
template <class C>
int func(C&& c)
{
//typedef typename std::result_of< C() >::type result_type;
typedef typename std::conditional<
std::is_pointer<C>::value,
std::result_of< C() >::type,
std::conditional<
std::is_object<C>::value,
std::result_of< typename C::operator() >::type,
void>
>::type result_type;
result_type result = c();
return result;
}
int main(int argc, char* argv[])
{
// call with a function pointer
func(foo);
// call with a member function
bar b;
func(b);
// call with a bind expression
func(std::bind(&bar::something, b, 42));
// call with a lambda expression
func([](void)->int {return 12;});
return 0;
}
result_of 템플릿 혼자 클래스 바, 내가 컴파일되지 않습니다 만든 투박한 조건에서 연산자()를 찾을 수있을 것 같지 않습니다. 어떤 아이디어? const 함수에 추가 문제가 있습니까?
아마도'func'가'result_type' 대신에'int'를 리턴하기 때문입니다 (이 예제에서는 모든 경우에'int'이지만 여전히 문제를 일으킬 수 있습니다)? –
@Chris : 아니, 그게 이유가 아니야. – kennytm
@KennyTM - 나는 생각하지는 않지만 여전히 문제라고 생각합니다. –