C++ 使用boost MPL或类似工具进行迭代器过滤的任何方法

C++ 使用boost MPL或类似工具进行迭代器过滤的任何方法,c++,boost,c++11,C++,Boost,C++11,本质上,我有两种情况,我使用boost::filter\u iterator来过滤迭代器中的某些条件。在这种情况下,我想同时过滤2个条件,我们已经有了一些预先存在的代码,但我想知道是否有一种惯用的方法可以通过boost或标准库来实现这一点: /*! TODO: Surely there should be something in std/boost to achieve this??? */ /*! Filter for things that satisfy F1 and F

本质上,我有两种情况,我使用
boost::filter\u iterator
来过滤迭代器中的某些条件。在这种情况下,我想同时过滤2个条件,我们已经有了一些预先存在的代码,但我想知道是否有一种惯用的方法可以通过boost或标准库来实现这一点:

    /*! TODO: Surely there should be something in std/boost to achieve this??? */
    /*! Filter for things that satisfy F1 and F2 */
    template <
        typename F1,
        typename F2,
        typename ArgT
    >
    struct filter_and
    {
        F1 f1;
        F2 f2;

        filter_and(F1 _f1, F2 _f2): f1(_f1), f2(_f2)
        {}

        inline bool operator() (ArgT const& arg) const
        {
            return f1(arg) && f2(arg);
        }
    };
/*!TODO:当然std/boost中应该有一些东西来实现这一点*/
/*! 筛选满足F1和F2的内容*/
模板<
类型名F1,
类型名F2,
类型名参数
>
结构过滤器和
{
F1;
F2 F2;
过滤器和(F1 F1,F2 F2):F1(F1),F2(F2)
{}
内联布尔运算符()(参数常量和参数)常量
{
返回f1(arg)和f2(arg);
}
};

如果一个解决方案需要c++11,只要最新的MSVC能够处理它就可以了。

试试这个:
make_filter_迭代器(它,[=](value_type const&v){返回f1(v)和f2(v);})

为了更喜欢的东西

bool and_in_order() { return true; }
template<typename F0, typename Funcs...>
bool and_in_order( F0&& f0, Funcs&&... funcs ) {
  return f0() && and_in_order(funcs...);
}

template<typename... Funcs>
struct and_unary_functors {
  std::tuple<Funcs...> funcs;
  template<typename Arg, typename seq=typename make_seq<sizeof...(Funcs)>::type>
  bool operator()(Arg&& arg) const;

  template<typename Arg, int...s>
  bool operator()<Arg, seq<s...>>(Arg&& arg) const {
    return and_in_order( [&](){ return get<s>(funcs)(arg); }... );
  }
};

template<typename... Funcs>
and_unary_functors<Funcs> make_and_unary( Funcs const&... funcs ) {
  return {std::make_tuple(funcs...)};
};

auto filter_it = make_filter_iterator( base_iterator, make_and_unary( f1, f2, f3, f4 ) );
bool和_的顺序(){return true;}
模板
布尔和_的顺序(F0&&F0,Funcs&&Funcs){
按顺序返回f0()&&和(funcs…);
}
模板
结构与一元函子{
std::元组函数;
模板
布尔运算符()(Arg&&Arg)常量;
模板
布尔运算符()(Arg&&Arg)常量{
按顺序返回和_([&](){return get(funcs)(arg);};
}
};
模板
和_一元函数_函子生成_和_一元函数(Funcs const&…Funcs){
返回{std::make_tuple(funcs…};
};
自动筛选=生成筛选迭代器(基迭代器、生成和一元(f1、f2、f3、f4));

或者像这样愚蠢的事情。

为什么不把两个过滤器迭代器叠加在一起?@ipc,我实际上没有想过要这么做,也许这是一个好的选择。