2

Nstd::size_t 유형의 템플릿 매개 변수로 설정하십시오. 나는 두 가지 방법으로 내 클래스의 생성자를 호출 할 수 싶습니다 :Variadic 인수 (팩 크기 N) 및 기본 인수

A a(x1, x2, x3, ..., xN) 

A a(x1, x2, x3, ..., xN, xN1) 

xi 변수는 같은 유형의 모든 곳. 내 첫 번째 생각은 다음과 같습니다.

template <std::size_t N> 
struct A 
{ 
    template <typename ...Args, typename = typename std::enable_if<N == sizeof...(Args), void>::type> 
    A(Args ...args) { 
     f(args...); // where f is some function 
    } 

    template <typename ...Args, typename = typename std::enable_if<N+1 == sizeof...(Args), void>::type> 
    A(Args ...args) { 
     // run f on the first N arguments 
     // run g on the last argument (selection is done using templates, I just did not want to write the code) 
    } 
}; 

이 기술에 대한 설명은 Variadic templates with exactly n parameters입니다. 물론이 문제는 생성자에 이런 식으로 오버로드 할 수 없다는 것입니다.

아이디어가 있으십니까?

답변

4

그냥 SFINAE 다르게 :

template <std::size_t N> 
struct A 
{ 
    template <typename ...Args, 
       typename std::enable_if<N == sizeof...(Args), int>::type = 0> 
    A(Args ...args) { 
    } 

    template <typename ...Args, 
       typename std::enable_if<N+1 == sizeof...(Args), int>::type = 0> 
    A(Args ...args) { 
    } 
}; 

Demo.

+0

차이점을 설명해 주시겠습니까? – 0x499602D2

+0

@ 0x499602D2 OP에있는 것과 동일한 함수 템플릿이 다른 기본 인수로 다시 정의됩니다. 서명의'enable_if' 부분을 만드는 것은이 두가지 별개의 함수 템플릿을 만듭니다. –

+0

SFINAE에서 이전 버전을 사용해야합니까? – 0x499602D2