remove_ifのオーバーロード
find_ifやremove_ifはコンテナ全体に対して行う場合が多いので、
beginとendを指定するのは冗長な場合がほとんどなのです。
vector<Test>::iterator End = remove_if(Tests.begin(), Tests.end(), bind(IsSameType, _1, TYPE_A)); Tests.erase(End, Tests.end());
こんなのを
vector<Test>::iterator End = remove_if(Tests, bind(IsSameType, _1, TYPE_A)); Tests.erase(End, Tests.end());
こんな感じで省略したい。
という訳で、オーバーロードで省略版を作成。
namespace std{ /* remove_if省略版 */ template <typename C, typename F> C::iterator remove_if(C& container, F function) { return remove_if(container.begin(), container.end(), function); } }
main.cpp:14: error: expected constructor, destructor, or type conversion before "remove_if" main.cpp:14: error: expected `;' before "remove_if" make: *** [main.o] Error 1
怒らりた。
Effective C++ 42項 typenameの2 つの意味を理解しよう
テンプレートパラメータに依存する型にはtypenameをつけるといいらしいぞ。
これだ!!
namespace std{ /* remove_if簡略版 */ template <typename C, typename F> typename C::iterator remove_if(C& container, F function) { return remove_if(container.begin(), container.end(), function); } }
通った通った。しめしめ。
find_ifとerase_ifも追加しちゃえ。という訳でこんな感じに。
namespace std{ /* find_if省略版 */ template <typename C, typename F> typename C::iterator find_if(C& container, F function) { return find_if(container.begin(), container.end(), function); } /* remove_if省略版 */ template <typename C, typename F> typename C::iterator remove_if(C& container, F function) { return remove_if(container.begin(), container.end(), function); } /* erase_if */ template <typename C, typename F> typename C::iterator erase_if(C& container, F function) { return container.erase(remove_if(container, function), container.end()); } }
よしよし、stdafx.hがいい感じに育ってきた。