2015-01-16 4 views
2

Is it possible to figure out the parameter type and return type of a lambda? 질문에서 function_traits 구조체의 멋진 구현은/linked으로 표시됩니다.기본 매개 변수에 대한 함수 특성

이 구조체는 각 매개 변수

에 대한

  • 매개 변수 유형은 실패하지만 (즉, R(Ts ...))

    • 반환 형식
    • 함수 호출 유형
    • 함수 인수에 대응을 결정할 수 있습니다 할 특성 기본 매개 변수로 제대로 작동합니다. 즉, 전체 유형 (모든 기본 매개 변수 포함) 만 함수의 유형으로 간주됩니다.

      주어진 함수 매개 변수가 기본 매개 변수인지 여부를 확인할 수있는 function_trait을 작성할 수 있습니까?


      특히, 나중에 함수에 전달하는 기능의 최소/최대 인수에 대응에 따라 주어진 구현을 활성화/비활성화 할 수 SFINAE를 사용하여이 특성을 사용, 그리고 매개 변수 팩의 크기 것 함수에 전달됩니다.

      분명히이 예제는 다소 인위적이다.

  • 답변

    3

    기본 인수가 이 아니고 기능 유형의 일부인이기 때문에 사용할 수있는 함수 유형만으로는 그렇게 할 수 없습니다. holds 다음은 :

    void foo(int, int); 
    void bar(int, int = 42); 
    
    static_assert(std::is_same<decltype(foo), decltype(bar)>::value, "He's wrong!"); 
    

    이것은 당신이 유형 Func의 기능이 매개 변수의 수보다 작은 인수의 특정 번호로 호출 할 수 있는지 여부를 말할 수 없음을 의미합니다.

    +0

    이것은 함수 포인터/참조를 통해 이동할 때마다 기본 인수가 더 이상 작동하지 않는다는 것을 의미합니다 (필수 항목이 됨). 맞습니까? 'auto bar2 = bar; '와 같은 뜻이다. – leemes

    +1

    맞다. 기본 인수는 직접 호출 사이트에서만 관련이 있습니다. –

    +0

    @SebastianRedl 설명해 주셔서 감사합니다. 나는 방금 테스트했습니다. [템플릿 매개 변수를 통해 전달 될 때 불가능합니다] (http://ideone.com/bkXnN9), 다소 슬픈 일입니다. – leemes

    관련 문제