現在受け入れているC++ 11の機能を習得しようとしており、autoとdecltypeに問題があります。学習の練習として、いくつかの一般的な関数を使ってstdクラスリストを拡張しています。C++でautoとdecltypeを使用する11
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)
私は、テンプレートクラスを使用せずにマップを定義し、まだそれが返すタイプで、それは一般的な持っているかを把握しようとしています。
私はベストプラクティスについて尋ねないautoとdecltypeの使い方を学んでいます。 – gradbot
ええ、でも知っていると恩恵を受けるかもしれない他のものがたくさんあります。私は列車の旅の前に私はdecltypeのものに着く前に中断した。今すぐ更新しました。 –
素晴らしい感謝! – gradbot