Учитывая две строки lhs
и rhs
, тогда lhs == rhs
определяется как семантически эквивалентный lhs.compare(rhs) == 0
. Другими словами, то, что делает ваш функтор, эквивалентно тому, что вы делаете f.my_type != t_
.
Имея это в виду, вы можете выразить то, что вы хотите с Фениксом, как:
bind(&Foo::my_type, arg1) =! ref(some_type)
Для справки, вы звонили участнику compare
на актера Феникса. Так как этот член принадлежит std::string
, это не то, что вы хотите. Я могу заставить работать следующее:
typedef int (std::string::*compare_type)(std::string const&) const;
compare_type compare = &std::string::compare;
bind(compare, bind(&Foo::my_type, arg1), "") != 0;
где последняя строка является последним функтором. Но это нехорошо, потому что нет надежного способа получить адрес перегруженного члена стандартного типа. Другими словами, вторая строка в приведенном выше тексте не гарантируется для компиляции.
Для дальнейшего использования я предпочитаю лямбды при вызове перегруженного члена:
auto compare = [](std::string const& lhs, std::string const& rhs)
{ return lhs.compare(rhs); };
// bind that functor and use it as a Phoenix actor etc