此函数的示例 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));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^