現在受け入れられているc++11の機能を学習しようとしていますが、autoとdecltypeに問題があります。学習演習として、いくつかの総称関数を使用してstdクラスリストを拡張しています。
template<class _Ty, class _Ax = allocator<_Ty>>
class FList : public std::list<_Ty, _Ax>
{
public:
void iter(const function<void (_Ty)>& f)
{
for_each(begin(), end(), f);
}
auto map(const function<float (_Ty)>& f) -> FList<float>*
{
auto temp = new FList<float>();
for (auto i = begin(); i != end(); i++)
temp->push_back(f(*i));
return temp;
}
};
auto *ints = new FList<int>();
ints->push_back(2);
ints->iter([](int i) { cout << i; });
auto *floats = ints->map([](int i) { return (float)i; });
floats->iter([](float i) { cout << i; });
メンバーマップの場合、渡された関数が何を返すかに応じて、戻り型を汎用にする必要があります。したがって、リターンタイプの場合、このようなことを行うことができます。
auto map(const function<float (_Ty)>& f) -> FList<decltype(f(_Ty))>*
これは、関数テンプレートのfloatタイプも削除する必要があります。
auto map(const function<auto (_Ty)>& f) -> FList<decltype(f(_Ty))>*
テンプレートクラスを使用することもできますが、リターンタイプを指定する必要があるため、インスタンスの使用がより冗長になります。
template<class T> FList<T>* map(const function<T (_Ty)>& f)
私の質問を要約すると、テンプレートクラスを使用せずにマップを定義し、それが返すタイプでジェネリックにする方法を理解しようとしています。