typename... Args에서 Args를 반환타입으로 사용할 수 없나요?
글쓴이: dltkddyd / 작성시간: 목, 2014/01/23 - 6:15오후
임의의 인수를 건내받고자 할 때 typename... Args와 같은 표현을 템플릿의 타입표현에 명시함으로써 임의의 인수를 받아낼 수 있습니다. 그런데 저 Args를 다시 돌려받으려면 어떻게 해야 하나요. 아래와 같은 코드가 있을 때
void C(FirstType first, Args... args) { cout<<"In c "<<first<<endl; } template<typename FirstType, typename SecondType, typename... Args> (Args...) b(FirstType first, SecondType second, Args... args) { cout<<"In b "<<first<<" "<<second<<endl; return args...; } template<typename... Args> void a(Args... args) { args=b(args...);//여기서 c(args...); } int main() { a(10,20,30,40,50,60,70,80); return 0; }
main에서 a함수를 위에서 처럼 사용하면 a 함수의 args는 10...80의 값을 넘겨받습니다. a 함수에서 이를 다시 b 함수를 넘기면서 b함수에서는 값 하나를 떼어내고 나머지 20...80의 값을 ektl 호출부로 돌려주도록 하려고 했는데 args가 값을 제대로 돌려받지 못합니다. 돌려받을 방법이 없을까요?
Forums:
C++에서는 한번에 하나의 객체만 반환할 수
C++에서는 한번에 하나의 객체만 반환할 수 있습니다.
std::tuple로 리턴 받으시고 c의 인자로
std::tuple로 리턴 받으시고 c의 인자로 unpack해서 넘겨주시면 됩니다.
c++ tuple unpack으로 검색해보세요.
그래서 다음과 같이 사용해봤는데 주석에 표시한 에러가 나옵니다.
말씀하신 방법으로 해결해보려고 다음과 같이 세 가지 경우로 시도해봤습니다. 두 번째 것을 제외하고 컴파일시 모두 오류가 발생합니다. 세 개의 코드는 다음과 같습니다.
결국 재귀적으로 멤버템플릿함수를 호출할 때에 오류가 발생한다는 것인데, 재귀적으로 호출하면서 오류가 뜨지 않게 하려면 첫 번째와 두 번째의 무엇을 고쳐야 하나요? 그리고 오류가 발생하지 않는 두 번째 것은 tie로 값이 제대로 args에 설정이 된 것인지 궁금합니다.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
재귀를 멈추기위한 특수화를 하셔야죠. 에러메시지에
재귀를 멈추기위한 특수화를 하셔야죠. 에러메시지에 인자가 없는 tuple에대해서 get을 쓸 수 없다고 잘 나와있네요.
댓글 달기