C++은 비 형식 템플릿 매개 변수가 함수 포인터, 유형을 포함하여 포인터가 될 수있게합니다. 나는 최근에 question에게 이것이 무엇에 유용한지를 물었고, 이것은 후속 조치 one of the answers입니다.함수 포인터 템플릿 매개 변수의 값을 추론하는 방법이 있습니까?
함수 포인터 템플릿 매개 변수의 값을 해당 함수 포인터 인 함수 인수에서 추론 할 수 있습니까? 예 :
using VoidFunction = void(*)();
template <VoidFunction F>
void templ(VoidFunction);
...
void func(); // a VoidFunction
...
templ<func>(func); // works, but I have to specify the template parameter explicitly
templ(func); // <-- I would like to be able to do this
이 추론을 수행 할 수있는 방법이 있습니까? 컴파일러 구현 자의 관점에서 함수 인수가 컴파일 타임에 코드의 함수로 해석 될 수있는 한 기술적으로 가능합니다.
이 문제에 대한 궁금증이 있다면 this answer 아래의 설명, 특히 std::bind()
의 구현을위한 가능한 최적화를 참조하십시오.
EDIT : templ<func>()
처럼 함수 인수를 제거하고 템플릿 인수를 사용할 수 있다는 것을 알고 있습니다. 함수 인수에 추가하는 유일한 목적은 템플릿 인수를 전달하지 않아도되도록하는 것입니다.
template <typename Function, Function F>
void templ(/* something */);
을 다음
templ(func);
또는
를 호출 할 수 : 내가 정말 원하는 것을 추측도 같이 함수 포인터의 유형을 추론하는 것입니다templ<func>();
및 형식과 값을 모두 단일에서 추론해야합니다 함수 포인터에 대한 언급.
희망은 지금 더 의미가 있습니다.
의 전체 템플릿 인수 목록을 작성하는 것을 피하기 위해, 오직 사용자 편의를 위해서만 여기에 사용되는
는주? 예를 들어, 이렇게 할 수 있습니다 :'template void foo (std :: size_t i) {int arr [N];/* fill */return arr [i];}'. 이 추론을 할 수있을 때 필자가 템플릿 인수를 잊어 버린다면 분명히 오류를 원할 것입니다. –
chris
생각해 보니 왜 함수 인수로 전달되어야하는지 이해할 수 없습니다. 'templ();'충분하지 않습니까? –
chris
@chris : 맞아, 제 질문은 서면으로별로 의미가 없었습니다. 제발 제 편집을 참조하십시오. – HighCommander4