私が現在やろうとしているのは、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 コンテナーで機能する上記のコードを実行できる一般的な方法が必要です。
そのような方法はありますか?