我目前要做的是扩展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容器上运行。
有这样的方法吗?
答案 0 :(得分:4)
尝试使用insert而不是push_back。
whereVecObjects.insert(whereVecObjects.end(), *iterObject);
我认为您需要更多通用的Queryable
template <class T, template<class, class...> class Container>
class Queryable
: public Container<T>
{
// ...
}
此外,我认为您只需要将Queryable用于容器。见Determine if a type is an STL container at compile time