2016-09-21 5 views
10

가변 개수의 인수를 사용하는 템플릿 함수가 있습니다. 인수를 특정 유형으로 강제 할 수 없으므로 적어도 컴파일 타임 결정된 수 (예 : 10)보다 인수 수가 더 많지 않도록하고 싶습니다.variadic 템플릿 매개 변수 팩의 매개 변수 수 제한

매개 변수 팩이있는 템플릿 함수의 컴파일 타임 결정 값보다 많은 인수가 있으면 컴파일러에서 오류를 발생시킬 수 있습니까?

template <class ...Args> 
void setRequestArguments(const Args&... args) 
{ 
    const std::vector<QGenericArgument> vec = { args... }; 
    qDebug() << sizeof...(args); 
    // Do stuff... 
    // for (unsigned i = 0; i < vec.size(); ++i) { 
    //  qDebug() << vec[i].name(); 
    // } 
} 

은 내가 무엇을 사용하려는 것은 QMetaObject::invokeMethod 래퍼 함수의 모든 인수에 대한 일반적인 컨테이너입니다.

+1

인수를 특정 유형으로 제한 할 수 있습니다. 이것에 대한 답변을 원하십니까? 당신은 인수가 정확히'T' 또는'T'로 변환 가능한 것을 요구합니까? – bolov

+0

@bolov 예, 제발, 매우 유용 할 것입니다! +1 –

+1

정확하게 다음과 같이 새 게시물을 만들었습니다. http://stackoverflow.com/questions/39659127/restrict-variadic-template-arguments/39659128#39659128 – bolov

답변

20

이, 함수가 호출되지하려면 당신이 sfinae과 기능을 제약 조건 수 있습니다. 그렇게하면 더 많은 인수를 허용하는 또 다른 오버로드가 있으면 컴파일러에서 올바른 오버로드를 선택할 수 있습니다. 조건에

간단한 std::enable_if 충분합니다 :

template <class ...Args> 
auto setRequestArguments(Args&&... args) -> std::enable_if_t<(sizeof...(args) <= 10)> 
{ 
    const std::vector<QGenericArgument> vec = { std::forward<Args>(args)... }; 
} 

편집 :

가독성을 위해서
template <class ...Args, std::enable_if_t<(sizeof...(Args) <= 10)>* = nullptr> 
void setRequestArguments(Args&&... args) 
{ 
    const std::vector<QGenericArgument> vec = { std::forward<Args>(args)... }; 
} 

, 당신은 함수의 뒤에 반환 형식에 제약을 넣을 수 있습니다 : const 참조 대신 전달 참조를 추가했습니다. 프로그램을 빠르게 처리 할 수 ​​있고 복사 할 수없는 유형보다 친숙하기 때문입니다.

+3

정말 SFINAE를 사용하는 흥미로운 방법입니다 :) – Rakete1111

14

매개 변수 팩이있는 템플릿 함수의 컴파일 타임 결정 값보다 많은 인수가 있으면 컴파일러에서 오류를 발생시킬 수 있습니까?

예는, static_assert를 사용 : 너무 많은 인수가있을 때

template <class ...Args> 
void setRequestArguments(const Args&... args) 
{ 
    static_assert(sizeof...(args) <= 10, "You can't have more than 10 arguments!"); 
    //Stuff... 
}