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がいい感じに育ってきた。