0

我有一个自定义列表类,并希望支持使用 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 );

而且我正在为接受这些“通用”比较运算符的方法的签名而苦苦挣扎。因为它们都有不同的类型,我不想要静态成员函数。如何向我的类添加一个接受比较运算符的方法?

非常感谢你!:)

4

3 回答 3

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(or std::function)

于 2013-02-19T15:03:52.047 回答
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);
}
于 2013-02-19T15:02:16.757 回答
1

签名应该是:

bool operator()(Myclass const & elem) const
于 2013-02-19T15:00:38.923 回答