2017-04-11 16 views
2

저는이 라이브러리의 API를 (다시) 설계하고 있습니다. 템플릿 화 된 여러 가지 인수를 취할이 함수가 있습니다. 로, 대안가변 템플릿 템플릿을 디자인 할 때 튜플이나 파라미터 팩을 선호해야합니까?

template<typename... Ts>  
void foo(bar_t bar, Ts... params); 

또는 : 나는 수를 정의 할 수 있습니다

template<typename... Ts>  
void foo(bar_t bar, std::tuple<Ts...> params); 

을 나는 (양 방향)이 두 교환 알고 :

C++11: I can go from multiple args to tuple, but can I go from tuple to multiple args?

그래서 두 옵션 모두 일반적으로 비슷하지만, 하나의 변형을 다른 변형보다 선호해야합니까 아니면 단순히 맛/개인 스타일의 문제입니까?

+1

필자는 이질적인 초기화 목록'{t1, t2, t3, ...} '이'std :: tuple '유형 * T1, T2 ... (언어의 일부가 아니기 때문에)의 공제 *를 사용하는 경우, 첫 번째 옵션은 여전히 ​​더 일반적입니다 (그러나 다른 이유로 불편 함). 두 번째 옵션은 호출자가 명시 적으로'std :: tuple <...> '또는'std :: make_tuple' 함수에 대해 알도록 강제합니다. – alfC

답변

1
  1. 튜플 방법은 호출자 측에서 더 어렵습니다. 예를 들어 전달은 사용자가 다른 tuple 정의 또는 forward_as_tuple 정의를 사용해야합니다. 반대로, 가변적 인 경우 전달은 함수 인터페이스의 문제입니다. 호출자는이를 인식 할 필요조차 없습니다.

  2. 튜플 방법은 많은 용도로 구현 자 측에서 어렵습니다. 매개 변수 팩의 포장을 푸는 것은 tuple의 포장을 푸는 것보다 훨씬 쉽습니다. 또한 매개 변수 팩은 제한적이지만 tuple보다 훨씬 유연하게 사용할 수 있습니다.

  3. 튜플 방법은 콜 체인을 허용합니다. Variadic 반환 값과 같은 것은 없으며 구조적 바인딩이 가까워지면 여러 반환 값을 함수의 여러 매개 변수로 이동할 수 없습니다. 반대로 튜플 및 튜플 반환 값을 사용하면 한 함수에서 다른 함수로 호출을 연결할 수 있습니다.

콜 체인 (call chaining)이 당신에게 중요한 요소 일 경우, 튜플 인터페이스가 적절할 수 있습니다. 그렇지 않으면, 그것은 약간의 진짜 이득을위한 많은 짐입니다.