2016-10-18 18 views
2

の入力/出力タイプを取得し、私は次のような問題があります:あなたが上見ることができるように呼び出し可能

template<typename Func, typename T_in = /*input type of Func */, typename T_out = /*output type of Func */> 
std::vector<T_out> foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<T_out> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 


int main() 
{ 
    // example for f(x) = x*x 
    std::vector<float> input = { /* ... */ }; 
    auto res = foo([](float in){ return in*in; }, input); 

    return 0; 
} 

が、私は入力ベクトルinputの各要素に機能fをマップする機能fooを実装しようとします。入力ベクトルinputの要素の入力タイプをf(つまりT_in)、出力ベクトルの要素の出力タイプをf(つまりT_out)にしたいが、 fooに明示的に出力タイプf(コードの可読性が向上しているため)コンパイル時に入力/出力タイプfがどのように自動的に導き出されるのか、誰にでも分かりますか?

事前に感謝します。

答えて

1

タイプT_ininputベクトルから推定することができます。

私はT_outの控除がtypename std::result_of<Func(T_in)>::type代わりのstd::result_of_t<Func(T_in)>を使用してstd::result_of_t

template <typename Func, typename T_in, 
      typename T_out = std::result_of_t<Func(T_in)>> 
std::vector<T_out> foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<T_out> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 

ための仕事だけではなく、C++ 14のために、C++ 11にも動作するはずだと思います。

0

関数のマップを使用すると、実際には非常に一般的なデザインパターンはC++です。私はstd :: Mapコンテナを使用することをお勧めします。 here is a link

幸運:)

+0

ありがとうございます。簡単にするために、私は上記の私のポストで単純化した例を使用しました。残念ながら、私の実際の例は、標準ライブラリを使用して実装することはできません。 –

2

decltypeautofooの戻り値の型を変更するとともに、このために働くだろう。

template<typename Func, typename T_in> 
auto foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<decltype(f(input[0]))> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 


int main() 
{ 
    // example for f(x) = x*x 
    std::vector<float> input = { /* ... */ }; 
    auto res = foo([](float in){ return in*in; }, input); 

    return 0; 
} 
関連する問題