3

さまざまな STL コンテナーに関数を特化したいことがよくあります。ただし、std::vector や std::deque など、必要なインターフェイスのほとんどを共有しているものもあるため、1 つずつ特殊化する必要はありません。

私のユースケースでは、主に 3 つのカテゴリ (ベクターのようなもの、セットのようなもの、マップのようなもの) があります。たとえば、次のようなものを実装したい

template <class T>
struct A {
    template <class Y, class... Z>
    void func( Y y , Z... z ){
        //hypothetical static_if
        static_if ( T is similar to vector, deque, or boost::stable_vector etc which have push_back ) {
            t.push_back(y);
        }
        else static_if ( T is similar to set, unordered_set or boost::flat_set etc which have emplace)    {
            t.emplace(y);
        }

        else static_if ( T is similar to map, unordered_map or boost::flat_map etc which has emplace) {
            t.emplace(y, z...);
        }

    }

    T t;  
};

これは不可能に思えるかもしれませんが、この状況に対する何らかのハックがあることを願っています。リスト型(std::list、std::forward_list、...)またはboost::heapなどに拡張できるとよいでしょう。しかし、目標を達成するのは難しすぎるようです。

4

4 に答える 4

0

不可能ではありません。実装するのが便利ではないか、簡単ではありません。本当に、container_traitsライブラリが必要です。

これは、SFINAEを使用して実装し、さまざまな STL Container ConceptsContainerの要件を満たすために必要な機能が特定のタイプに含まれているかどうかを検出できます。

たとえば、is_associative_containerSFINAE を使用して、Container型にkey_typeand mapped_typetypedef、およびstd::pair<const key_type, map_type>forがあり、その概念value_typeを実装するオブジェクトの他のすべての要件があることを確認できます。AssociativeContainer

とにかく、これは本格的なライブラリとして実装する必要があるものです。実装するのは簡単ではありません。単純な 1 回限りの必要がある場合は、おそらく別のソリューションを探す必要があります。Iteratorレベルで抽象化したほうがよいでしょう。

于 2013-06-14T14:43:02.570 に答える