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

冗長宣言型を必要としない自動返却型の形式はありませんか? –

+0

それは素敵ではないでしょうか?それは利用可能だとは思わない。 –

関連する問題