2017-10-01 3 views
0

함수 포인터를 사용하는 템플릿 함수를 만드는 중입니다. 구문을 좀더 단순화하려고하고 있지만 말입니다.함수 포인터 인수에 대한 자동 리턴 유형?

지금까지 내가 좋아하는 뭔가가 있습니다, 말썽이

template< typename obj, typename ret, typename... args > 
auto py_wrapped_func(ret (obj::*f)(args...)) 
{ 
    // Do some stuff with the function pointer. 
} 

, 때로는 반환 형식, RET 긴 미쳤다. "함수 프로토 타입에서 허용되지 않습니다 decltype (자동)"- 분명히

template< typename obj, typename... args > 
auto py_wrapped_func(decltype(auto) (obj::*f)(args...)) 
{ 
    // Do some stuff with the function pointer. 
} 

이 컴파일되지 않습니다 : 같은이를 단순화 할 수있는 방법이 있는지 궁금하네요. 이 문제를 해결할 더 좋은 방법이 있습니까?

나는 함수 유형에 직접 템플릿을 사용할 수 있다는 것을 알고 있지만, 템플릿을 사용할 때 또는 decltype(&obj::func)을 사용할 때 템플릿 함수 유형을 작성하지 않아도되는 것을 선호합니다. 어쨌든 템플릿에 명시 적으로 나타 내기 위해 템플릿 매개 변수로 args 인수가 필요합니다.

필자는 컴파일러가 함수 포인터 유형과 객체 및 일부 인수를 명시 적으로 알 필요가 있다고 생각합니다. 너무 많이 묻는거야? 내가 어쩌면?

+2

왜 반환 유형 얼마나 오래 상관 없어? 표시된 코드에서 아무 것도 입력하지 않아도됩니다. 해결해야 할 실제 문제의 예를 보여주십시오. –

+0

분명히 템플릿을 사용할 때 반환 유형을 지정해야합니다. 내 시나리오에서 나는 std :: vector , GetArraySize() >>와'그 함수 템플릿에 포함 된 쓰레기처럼 보인다. 이것은 코드 가독성에 도움이되지 않습니다. 실제 문제입니다. – Matt

+0

왜 템플릿을 사용할 때 반환 유형을 지정해야한다고 생각하십니까? 템플릿 매개 변수 공제가 어떤면에서 효과가 없습니까? 다시 말하지만, 긴 유형의 철자를 사용해야한다고 생각하는 예를 보여줍니다. –

답변

0

이것은 아마도 this 질문의 중복입니다.

함수의 인수는 템플릿 매개 변수 공제를 통해 제공 될 수 없지만 함수는 제공 할 수 있습니다.

template< typename... args, typename obj, typename ret > 
auto py_wrapped_func(ret (obj::*f)(args...)) 
{ 
    // Do some stuff with the function pointer. 
} 

이제 객체와 유형이 인수에서 유추 할 수 반환 : 간단한 해결책은 다음과 같이 템플릿 인수를 다시 정렬하는 것입니다.

왼쪽에있는 가변적 인 템플릿 인수와 함께 작동하는지 확신 할 수 없었습니다. 그러나 그것은 잘 컴파일하는 것 같다 ...

+0

반환 유형을 추론 할 수 있습니다 아무 문제가 없으면 어떤 것을 다시 배열 할 필요가 없습니다. 리턴 타입은 인수 –

+0

의 정의의 일부입니다. 예, 템플릿 매개 변수 공제가 오른쪽에서 왼쪽으로 진행되고 인수 args가 내에서 추론 될 수 없습니다 시나리오에서는 첫 번째 인수로 필요합니다. – Matt

+0

연결하는 질문에 대한 대답은 "템플릿 인수의 순서는 공제에 중요하지 않습니다"라고되어 있습니다. – VTT

관련 문제