如何用 C++11 中的 lambda 调用替换函子调用?

Gio*_*gio 0 c++ lambda c++11

我有一个抽象模板类

template <typename T>
class Predicate1
{
  public:

    Predicate1();

    virtual ~Predicate1();

    virtual bool operator() (const T item) const = 0;
};
Run Code Online (Sandbox Code Playgroud)

一个实现

class Pred : public Predicate1<string>
{
  public:

    virtual bool operator() (const string item) const;
};


bool Pred::operator()(const string item) const
{
  return item == "";
}
Run Code Online (Sandbox Code Playgroud)

以及一个带有filter谓词方法的模板类:

template <typename T>
class TList : public boost::enable_shared_from_this<TList<T> >
{
  public:

    typedef boost::shared_ptr<const TList<T> > List;

    const List filter(const Predicate1<T>& p) const;

    ...
};
Run Code Online (Sandbox Code Playgroud)

然后我使用过滤器如下:

int main(int argc, char *argv[])
{
  const TList<string>::List l1 = ...;

  const TList<string>::List l2 = l1->filter(Pred());
}
Run Code Online (Sandbox Code Playgroud)

这工作正常。但是,我不知道如何用匿名函数替换函子。我试过了:

const TList<string>::List l2 =
  l1->filter([] (const string item) -> bool { return item == ""; });
Run Code Online (Sandbox Code Playgroud)

据我所知,匿名函数与函子的()运算符具有相同的签名,因此它应该可以工作。相反,我收到编译器错误:

error: no matching function for call to ‘TList<std::basic_string<char> >::filter(main(int, char**)::<lambda(std::string)>) const’
note: candidate is: const TList<T>::List TList<T>::filter(const Predicate1<T>&) const [with T = std::basic_string<char>, TList<T>::List = boost::shared_ptr<const TList<std::basic_string<char> > >]
Run Code Online (Sandbox Code Playgroud)

所以,不知何故,这些类型似乎不兼容,但我不明白我是否忽略了什么或我做错了什么。或者换句话说,我必须如何声明该filter方法才能(仅)接受带有签名的匿名函数

const string -> bool
Run Code Online (Sandbox Code Playgroud)

或者,一般来说,const T -> bool

eca*_*mur 5

不要编写自己的接口类,而是使用std::function

const List filter(const std::function<bool (const T)>& p) const;
Run Code Online (Sandbox Code Playgroud)

std::function具有来自 lambda 和函子的构造函数,因此您可以继续使用Pred.