2

나는 variadic 함수 템플릿에 문제가 있습니다. 매개 변수 팩의 각 요소를 검사하고 요소를 패키지화 한 다음 모든 패키지 된 요소를 튜플에 채워서 반환해야합니다.매개 변수 팩의 각 요소를 수정하고 이들로부터 튜플을 만드는 방법은 무엇입니까?

template<typename A> 
sometype func_helper(A a) { 
    //examine a, depending on type, do different stuff with it. 
    return modified_a; 
} 

template<typename... Args> 
tuple<sometypes...> func(Args... args) { 
    return make_tuple(func_helper...(args)); 
} 

어떤 아이디어 : 여기 (반환 형식, 그들은 것 무엇인지 바로 자리 없음) 할 싶은 일의 일반적인 생각이다?

+2

'return std :: make_tuple (func_helper (args) ...); –

+0

그래, 내가 그 질문에 대해 실제로 그랬다. 나는 그것을 시도하지 않았다는 것을 믿을 수 없다. 감사! –

답변

7

연역 형을 사용할 수 있습니다. 슬프게도 그것은 코드 반복을 가지고 있습니다 :

#include <iostream> 
#include <tuple> 

template<typename A> 
int func_helper(A) { 
    //examine a, depending on type, do different stuff with it. 
    return 1; 
} 

char func_helper(double) { 
    return 'A'; 
} 

template<typename ...Args> 
auto func(Args... args) -> decltype(std::make_tuple(func_helper(args)...)) { 
    return std::make_tuple(func_helper(args)...); 
} 

int main() 
{ 
    auto a = func(1, 3.4); 
    std::cout << std::get<0>(a) << ' ' << std::get<1>(a) << '\n'; 
} 
+1

나는 func_helper를 그렇게 호출 할 수 있다는 것을 몰랐다. 형식을 추론 할 수 있다는 것을 알았지 만, 어떤 이유로 sizeof()가 ... 표기법으로 호출 할 수있는 유일한 함수라고 생각했습니다. 어쨌든, 그냥 시도하고 작동합니다. 감사! –

+0

여분의 decltype이 필요없는 자동 반환 형식의 형식이 없습니까? –

+0

그게 좋지 않겠습니까 :) 그게 가능하다고 생각하지 마십시오. –

관련 문제