我有一个抽象模板类
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
?