class baseFunctor{
virtual ~baseFunctor() {}
virtual bool operator()(const A& lhs, const A& rhs) = 0;
};
class derivedFunctor : public baseFunctor{
bool operator()(const A& lhs, const A& rhs) override { /*implementation*/ }
};
Run Code Online (Sandbox Code Playgroud)
在另一个不相关的方法中,我有:
baseFunctor* functor = new derivedFunctor();
std::vector<A> vectorA;
Run Code Online (Sandbox Code Playgroud)
我的目的是使用这个仿函数作为比较函数,如下所示:
std::make_heap(vectorA.begin(),vectorA.end(),*functor);
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
C2893无法专门化函数模板'void std :: make_heap(_RanIt,_RanIt,_Pr)'
在那种情况下使用指针到functor的正确方法是什么?
函数对象在标准算法中按值传递.这意味着该derivedFunctor对象将通过值传递为baseFunctor.因为baseFunctor是一个代码无法编译的抽象类.(如果它不是一个抽象类,代码会编译,但可能由于对象切片问题而行为不端.)
为了使这项工作,你可以使用类似的东西std::reference_wrapper:
std::make_heap(vectorA.begin(),vectorA.end(),std::ref(*functor));
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为引用包装器对象避免复制仿函数并保留引用; 因为它可以直接调用,只是简单地将参数转发给对象引用.
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |