C++ C++;:为自己的结构使用mem-fun

C++ C++;:为自己的结构使用mem-fun,c++,stl,C++,Stl,此函数的示例如下所示 表示std::string::length可以作为std的最后一个参数传递:使改变由于手动原因,std::string::length不是静态的(如果我错了,请纠正我) 我假设我可以创建自己的结构/类,并将其成员作为std::transform的最后一个参数传递,例如: struct ss { int ssFun(int n) { return 2*n; } }; 所以我可以做以下几点: int tab[] = {1,2,3,4,5}; std::v

此函数的示例如下所示 表示std::string::length可以作为std的最后一个参数传递:使改变由于手动原因,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\u fun
返回一个函数对象,必须使用一个参数调用该函数对象,该参数是调用成员函数的对象。例如:

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

S s;
fun(s); // "Hello"
std::transform
内部,functor对象使用
[inVect.begin(),inVect.end())
中的向量元素进行调用,这些元素是整数(不是用来调用成员函数的对象)。如果这些元素的范围是
ss
类型的元素,它就可以工作(某种程度上),但由于函数是用
int
s调用的,因此它将不起作用。为了避免这种情况,我们必须在启动
std::transform
之前将
std::bind
成员函数绑定到实例变量

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

你是指
std::transform
而不是
std::mem_-fun
std::transform(inVect.begin(), inVect.end(),
               outVect.begin(), std::bind(&ss::ssFun, myStruct));
//                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^