我有一个抽象模板类
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?
不要编写自己的接口类,而是使用std::function:
const List filter(const std::function<bool (const T)>& p) const;
Run Code Online (Sandbox Code Playgroud)
std::function具有来自 lambda 和函子的构造函数,因此您可以继续使用Pred.
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |