此功能的示例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 ) );
不幸的是,它不起作用。为什么呢?
答案 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));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^