5

私が現在やろうとしているのは、C++ std コンテナーの機能を拡張することです。だから私はそのようにしました

template<typename T>
class Queryable : public T
{
public:
    template<typename lambdaFunc>
    Queryable<T>Where(const lambdaFunc& w)
    {
        Queryable<T> whereVecObjects;

        for(auto iterObject = this->cbegin();
            iterObject != this->cend();
            ++iterObject)
        {
            bool add = w(*iterObject);
            if(add == true)
            {
                whereVecObjects.push_back(*iterObject);
            }
        }

        return whereVecObjects;
    }           
};

したがって、このクラスが行うことは、テンプレートで std コンテナーを受け入れ、それを継承するクラスを作成することです。次に、コンテナで拡張したい関数を定義します。

std::vector上記で提供したこの例は、そのように使用している場合に正常に機能します

int main()
{
    Queryable<std::vector<int>> vecInt;
    vecInt.push_back(1); vecInt.push_back(2); vecInt.push_back(3); vecInt.push_back(4); vecInt.push_back(5); 
    Queryable<std::vector<int>> filteredVec = vecInt.Where([](int i){ return i > 3; } );
    for(auto iter = filteredVec.begin();
        iter != filteredVec.end();
        ++iter)
    {
        std::cout << *iter << ", ";
    }
}

しかし、これを std::map で使用しようとすると、この行のために問題が発生しますwhereVecObjects.push_back(*iterObject);

ここで、すべての std コンテナーで機能する上記のコードを実行できる一般的な方法が必要です。

そのような方法はありますか?

4

1 に答える 1

4

push_back の代わりに insert を使用してみてください。

whereVecObjects.insert(whereVecObjects.end(), *iterObject);

より一般的な Queryable が必要だと思います

template <class T, template<class, class...> class Container>
class Queryable
  : public Container<T>
{
  // ...
}

また、コンテナーでのみ Queryable を使用する必要があると思います。コンパイル時に型が STL コンテナーかどうかを判断するを参照してください。

于 2013-09-20T04:24:54.127 に答える