C++에서 가변 길이의 튜플을 수정하는 함수가 있을 수 있나요?
문제
C++0x에서는 다음과 같은 함수를 작성하고 싶습니다.
template <typename... Types>
void fun(typename std::tuple<Types...> my_tuple) {
//Put things into the tuple
}
나는 처음에 for 루프를 사용하려고 시도했습니다. int i
그런 다음 다음을 수행하십시오.
get<i>(my_tuple);
그런 다음 결과에 일부 값을 저장합니다.하지만, get
에서만 작동합니다 constexpr
.
변수를 가져올 수 있다면 tuple
인수를 통해 매우 쉽게 재귀할 수 있는 가변 템플릿 함수에 전달합니다. 하지만 변수를 튜플에서 가져오는 방법을 전혀 모릅니다. get
.이를 수행하는 방법에 대한 아이디어가 있습니까?아니면 이것을 수정하는 다른 방법이 있는 사람이 있나요? tuple
?
해결책
"i" 이후
get<i>(tup)
컴파일 타임 상수여야 하며 템플릿 인스턴스화는 값을 통해 "반복"(실제로 재귀)하는 데 사용됩니다.부스트 튜플에는 여기서 도움이 될 수 있는 "길이" 및 "요소" 메타 기능이 있습니다. C++0x에도 이러한 기능이 있다고 가정합니다.
다른 팁
부스트.퓨전 볼만한 가치가 있습니다.'반복'할 수 있습니다. std::pair
, boost::tuple
, 일부 다른 컨테이너 및 자체 튜플 유형(지원하지 않는 것 같지만) std::tuple
아직.
AFAICT, C++ 튜플은 기본적으로 재귀로 처리해야 합니다.튜플을 패킹/언패킹하는 실제 방법이 없는 것 같습니다. 제외하고 유형 시스템의 유일한 가변 템플릿 처리를 사용합니다.
TR1의 섹션 6.1.3.4를 살펴보세요. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf
get은 const 및 non-const 자격을 갖춘 튜플 모두에 대해 정의되고 적절한 참조 유형을 반환합니다.함수 선언을 다음과 같이 변경하는 경우:
template
void fun(typename std::tuple& my_tuple) {
//Put things into the tuple
}
그런 다음 함수에 대한 인수는 const가 아닌 튜플이며 get을 사용하면 이전 응답에서 제공된 정보를 사용하여 반복을 작성한 후 필요한 할당을 수행할 수 있습니다.
튜플 인수를 함수 호출로 풀기 위한 템플릿 재귀의 예는 여기에서 내 대답을 살펴보세요.