具有不同谓词的boost Filter迭代器
boost Filter iterator with different predicates
我正在尝试实现一个返回boost::filter_iterator对(begin,end)的方法。
我希望这个方法在过滤方面是可定制的,但我不知道如何解决这个问题,因为当我键入过滤器迭代器范围时,我必须对我想要使用的谓词进行硬编码,并且我不能根据方法在输入中接收的参数来选择它。
我想要这样的东西:
enum FilterType
{
FilterOnState = 0,
FilterOnValue,
FilterOnSize,
FilterOnWhatever...
}
typedef boost::filter_iterator<PredicateStruct, std::list<Object>::iterator> filter_iterator;
std::pair<filter_iterator, filter_iterator> filterObjects(FilterType filterType);
我也考虑了一个可能的模板解决方案,但在调用过滤器之前,我需要客户端访问谓词实现并实例化符合他需求的谓词实现,他几乎会自己完成所有工作:这就是为什么我最喜欢基于枚举的解决方案。
template<typename P>
std::pair<boost::filter_iterator<P, std::list<Object>::iterator>,
boost::filter_iterator<P, std::list<Object>::iterator>> filterObjects(P& predicate);
谓词"基类"是否可能是基于枚举的实现的解决方案?
提前感谢!贾科莫
为什么不简单地提供预定义的谓词而不是枚举值?
struct predef_predicate{
predef_predicate(FilterType f)
: filt(f) {}
template<class T>
bool operator()(T const& v) const{
// filter in whatever way...
}
private:
FilterType filt;
};
namespace { // guard against ODR violations
predef_predicate const filter_state(FilterOnState);
predef_predicate const filter_values(FilterOnValue);
// ...
}
然后,不用重新设计轮子,只需使用Boost.Range的filtered
适配器。
#include <vector>
#include <iterator>
#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/algorith/copy.hpp>
int main(){
std::vector<int> v;
// fill v
std::vector<int> filtered;
boost::copy(v | boost::adaptors::filtered(filter_values),
std::back_inserter(filtered));
}
有了C++11,由于有了lambdas,创建谓词的操作变得更加容易。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- boost zlib filter 在 Windows 中不起作用
- 具有不同谓词的boost Filter迭代器
- 使用Boost Filter迭代器处理非基元对象