У меня есть приложение Visual Studio 2008 C++, в котором я хотел бы заменить унарный функтор лямбда-выражением boost::phoenix.
В моем случае у меня есть список объектов, содержащих строку. Я хочу удалить все объекты со строкой, не совпадающей с указанной. Итак, я использую такой алгоритм:
struct Foo
{
std::string my_type;
};
struct NotMatchType
{
NotMatchType( const std::string& t ) : t_( t ) { };
bool operator()( const Foo& f ) const
{
return f.my_type.compare( t_ ) != 0;
};
std::string t_;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector< Foo > list_of_foo;
/*populate with objects*/
std::string some_type = "some type";
list_of_foo.erase(
std::remove_if( list_of_foo.begin(),
list_of_foo.end(),
NotMatchType( some_type ) ),
list_of_foo.end() );
return 0;
}
Это прекрасно работает. Но я хотел бы немного почистить свой код, избавиться от функтора NotMatchType
и заменить его простым лямбда-выражением, подобным этому:
using boost::phoenix::arg_names::arg1;
list_of_foo.erase(
std::remove_if( list_of_foo.begin(),
list_of_foo.end(),
arg1.my_type.compare( some_type ) != 0 ),
list_of_foo.end() );
очевидно, это не работает.
Я также пробовал: ( arg1->*&Foo::my_type ).compare( some_type ) != 0
Что мне нужно сделать, чтобы boost:phoenix:actor выглядел как объект Foo
?