私は Haskell から来て、現在 C++11 で何ができるかを調べています。map
私のおもちゃの 1 つは、Haskell関数を模倣しようとする小さなテンプレートです。つまり、 の値のコンテナと を にX
マッピングする関数X
を取り、 の値Y
のコンテナを生成しますY
。を使用して簡単にできることはわかっていますstd::transform
が、それでは楽しみが台無しになります。
現在、私のテンプレートは次のようになっています。
template <typename T, typename U>
void myMap( const T &input,
U &output,
std::function<typename U::value_type (typename T::value_type)> f );
さて、私の質問は次のとおりです。出力コンテナを参照(2番目の引数)で取得する代わりに、戻り値を介して新しいコンテナを生成し、コンパイラが戻り値の型を推測できるように署名を調整することは可能ですか? 何かのようなもの
template <typename T, typename U>
U myMap( const T &input,
std::function<typename U::value_type (typename T::value_type)> f );
残念ながら、次のように呼び出すことはできません
std::vector<int> x = { 1, 2, 3, 4 };
std::list<bool> y = myMap( x, []( int x ) { return x % 2 == 0; } );
...少なくとも、Clang はここで戻り値の型を推測できません。
私が持っていた 1 つのアイデアは、入力コンテナーの型と関数の型がわかっている場合、そこから出力の型を構築できるというものでした。つまり、次のようなもの
template <typename C, typename T, typename U>
C<U> myMap( const C<T> &input,
std::function<U (T)> f );
...しかし、悲しいかなC<U>
、有効な構文ではないようです。この質問decltype
の場合のように、適切な妖精の粉が必要なだけなのだろうか。