델리게이트 라이브러리를 작성 중이고이 문제에 대해 고민했습니다. 다음과 같이 foo라는 오버로드 된 함수가 있다고 가정 해 보겠습니다.
int foo(double d);
double foo(int d);
서명을 템플릿 매개 변수로 지정하여 어떤 함수가 의미하는지 확인하려면 템플릿 인수 목록을 어떻게 작성해야합니까? 기본적으로이 구문을 원합니다 (그러나 모든 서명과 함께 작동합니다).
Delegate d = make_delegate<&foo,int(double)>(); // "Delegate" is automatically deduced as Delegate<int(double)>
다음 도우미 템플릿을 사용하여 해결했지만 함수 서명의 매개 변수 유형을 수동으로 작성하는 경우에만 작동합니다. 가변 매개 변수 팩 Args...
(Args_pack 특수화로 인코딩 됨)을 함수 서명 으로 전달하는 데 어려움을 겪고 있습니다.
template<typename... Args>
struct Args_pack {}
template<typename Signature>
struct Identify_signature_type;
template<typename Return, typename... Args>
struct Identify_signature_type<Return(Args...)> {
using T_return = Return;
using Args_pack = Args_pack<Args...>;
};
template<auto Signature> using Identify_signature = Identify_signature_type<decltype(Signature)>;
template<typename Signature, typename Identify_signature_type<Signature>::T_return Function(double /* important magic needed here */)>
auto make_delegate()
{...}
Delegate d = make_delegate<int(double), &foo>(); // Works. However, it would be nice if the template parameters could exchange places.
*
서명에를 추가 하여 올바른 함수 포인터 유형을 얻을 수 있습니다 .
template<typename Signature, Signature* fptr>
auto make_delegate()
{...}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다