std容器是否具有插入任何容器的通用方法?

Cae*_*sar 5 c++ containers stl insert

我目前正在尝试做的是扩展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;
    }           
};
Run Code Online (Sandbox Code Playgroud)

因此,该类所做的是它在模板中接受一个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 << ", ";
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在std :: map上使用它时,由于这一行,我最终遇到了问题 whereVecObjects.push_back(*iterObject);

现在,我想要一种通用的方式来执行上面的代码,该代码适用于所有std容器。

有这种方法吗?

PSy*_*ton 4

尝试使用 insert 而不是 Push_back。

whereVecObjects.insert(whereVecObjects.end(), *iterObject);
Run Code Online (Sandbox Code Playgroud)

我认为你需要更通用的可查询

template <class T, template<class, class...> class Container>
class Queryable
  : public Container<T>
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

另外我认为你只需要在容器中使用 Queryable 。请参阅在编译时确定类型是否是 STL 容器