C++:将mem乐趣用于自己的结构



此函数的示例 http://www.cplusplus.com/reference/functional/mem_fun/确实说 std::string::length 可以作为 std;:transform 的最后一个参数传递。由于手动,std::string::length 不是静态的(如果我错了,请纠正我)

我假设我可以创建自己的结构/类,并将其成员作为 std::transform 的最后一个参数传递,例如:

struct ss
{
  int ssFun(int n)
  {
    return 2*n;
  } 
};

所以我可以执行以下操作:

int tab[] = {1,2,3,4,5};
std::vector<int> inVect( tab, tab+5 );
std::vector<int> outVect;
ss myStruct;
outVect.resize(5);
std::mem_fun( inVect.begin(), inVect.end(), outVect.begin(), mem_fun( &ss::ssFun ) );

既不是:

std::mem_fun( inVect.begin(), inVect.end(), outVect.begin(), mem_fun( myStruct.ssFun ) );

不幸的是,它不起作用。为什么?

这里的问题是std::mem_fun返回一个函数对象,必须使用一个参数调用该参数,该参数是调用成员函数的对象。例如:

auto fun = std::mem_fun(&S::sayHello);
S s;
fun(s); // "Hello"

std::transform内部,函子对象是用来自[inVect.begin(), inVect.end())的向量的元素来调用的,这些元素是整数(不是用来调用成员函数的对象)。如果这些元素的范围是类型 ss 的元素,它本来可以工作(有点),但由于该函数是用 int s 调用的,所以它不起作用。为了规避这种情况,我们必须在启动 std::transform 之前将成员函数std::bind到实例变量。

std::transform(inVect.begin(), inVect.end(),
               outVect.begin(), std::bind(&ss::ssFun, myStruct));
//                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

最新更新