C ++:如何允许自己的比较运算符()?

时间:2013-02-19 14:58:49

标签: c++ stl

我有一个自定义列表类,并且希望使用STL中已知的“比较运算符”来支持操作。例如:

std::list<MyClass> d;
struct not_key {
    not_key( std::string const& str) : str_(str) {}

    bool operator( MyClass& elem ) {
        return !elem.findThatThing();
    }

    std::string str_;
};


not_key comp("value");
d.remove_if( comp );

mylist<MyClass> e(d);
e.filter( comp );

我正在努力寻找接受这些“一般”比较运算符的方法的签名。因为它们都有不同的类型,我不想要静态成员函数。如何向接受比较运算符的类添加方法?

非常感谢! :)

3 个答案:

答案 0 :(得分:4)

如果你的意思是你想知道mylist :: filter的签名,你可能只是将它作为一个模板,使用Pred或类似的类型。

template< typename T >
class mylist
{
   public:
      template< typename Pred >
      void filter( Pred pred )
      {
          // implement, calling pred(elem) for each element or pred(*iter)
      }
};

请注意,您可以将自由函数传递给该模板函数,在C ++ 11中,您将能够传入lambda。

如果你想要的东西不是模板(除了元素类型),你可以使用boost::function(或std::function

答案 1 :(得分:3)

标准函数(例如std::sort)使用模板参数,该参数被推断为比较函数类对象的类型:

template <class UnaryPredicate>
void filter(UnaryPredicate func) {
  // Call it like:
  func(something);
}

现在UnaryPredicate将被推断为您传递给它的任何类似函数的对象的类型。 UnaryPredicate比将它称为比较函数更有意义,因为它只需要一个参数。比较函数通常需要两个参数并进行比较。

或者,您可以选择std::function<bool(const MyClass&)>

void filter(std::function<bool(const MyClass&)> func) {
  // Call it like:
  func(something);
}

答案 2 :(得分:1)

签名应为:

bool operator()(Myclass const & elem) const