0

我有一个抽象模板类

template <typename T>
class Predicate1
{
  public:

    Predicate1();

    virtual ~Predicate1();

    virtual bool operator() (const T item) const = 0;
};

一个实现

class Pred : public Predicate1<string>
{
  public:

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


bool Pred::operator()(const string item) const
{
  return item == "";
}

和一个模板类,其方法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;

    ...
};

然后我按如下方式使用过滤器:

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

  const TList<string>::List l2 = l1->filter(Pred());
}

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

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

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

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> > >]

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

const string -> bool

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

4

1 回答 1

5

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

const List filter(const std::function<bool (const T)>& p) const;

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

于 2013-02-01T12:17:58.373 回答