c++ - 仿函数在 C++ 中不起作用

标签 c++ functor

我有一个 Vector 类(不是内置的)。我想编写一个可以遍历 Vector 类的内置函数。 vector 类是这样定义的:

template <typename T> class Vector{int _size; int _capicity ; T* _elem;
   /(protected and public functions/};

然后我写一个公共(public)函数遍历:

template <typename T> template <typename VST> 
void Vector<T>::traverse ( VST& visit ) 
{ for ( int i = 0; i < _size; i++ ) visit ( _elem[i] ); }
//visit here represent some action that I am gonna perform on the elements

测试代码: 我编写了一个仿函数来对 vector 类的每个元素执行 _elem[i]++。

template <typename T>
struct Increase 
  {virtual void operator() ( T& e ) { e++; }  }; 

在主程序中,我写了一个函数:

template <typename T>
void increase ( Vector<T> & V )
 {  V.traverse ( Increase<T>() );  } 

注意:这个函数不同于Increase函数,后者是一个仿函数。

下面是我如何测试我的程序:

 Vector<int> c={1,2,3,4,5}; //initialize my vector class
 increase(c);

返回错误信息:

 no match function for call to 'traverse'.

我发现这可能与我声明遍历的方式有关。

void Vector<T>::traverse ( VST& visit );
V.traverse ( Increase<T>() );//this is the way I called this function.

然后我把这里的“&”去掉,使用VST visit,这次可以了,但我还有一个大问题,我不知道为什么我不能使用VST& visit作为遍历函数的变量。

我似乎可以通过引用传递。

最佳答案

在遍历函数中按值取VST。目前,您传递的右值对象只能被 const-reference(const T&) 或 r-value reference (T&&) [成为通用引用模板]。

template <typename T> 
template <typename VST> 
void Vector<T>::traverse ( VST visit ) 
{ 
   for ( int i = 0; i < _size; i++ ) visit ( _elem[i] ); 
}

要使其通过引用工作,首先创建仿函数的 l-value 实例,然后调用 traverse

template <typename T>
void increase ( Vector<T> & V )
{  
   Increase<T> inc;
   V.traverse ( inc );  
} 

但如果可以的话,更喜欢按值传递。 STL 按值获取仿函数。此外,您也不应该使用 const-reference,因为那样您还必须使您的 operator() const

关于c++ - 仿函数在 C++ 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37929577/

相关文章:

c++ - 创建仿函数时友元函数的可见性

c++ - 如何创建新桌面? C++

c++ - 是否只有一种方法可以实现冒泡排序算法?

functor - Coq 证明选择 monad 是一个应用程序和一个 monad

haskell - 为什么 (++) 可以用于使用 map 预先添加和附加?

haskell - fmap 如何与数据构造函数一起使用?

python - 如何使用pybind11返回一个DataFrame?

c++ - 为什么限制关键字不是 C++ 的一部分?

C++ 类成员初始化序列

c++ - 函数和仿函数的区别