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

时间:2014-02-15 23:17:55

标签: c++ stl

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

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

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 ) );

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

1 个答案:

答案 0 :(得分:0)

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

auto fun = std::mem_fun(&S::sayHello);

S s;
fun(s); // "Hello"

std::transform内,使用来自[inVect.begin(), inVect.end())的向量元素调用仿函数对象,这些元素是整数(并不意味着要调用成员函数的对象)。如果这些元素的范围是ss类型的元素,那么它会起作用(种类),但由于函数是用int调用的,所以它不起作用。为了避免这种情况,在开始std::bind之前,我们必须std::transform成员函数到实例变量。

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