gpt4 book ai didi

C++:对自己的结构使用mem fun

转载 作者:太空宇宙 更新时间:2023-11-04 13:55:12 26 4
gpt4 key购买 nike

这个函数的例子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()) 的 vector 元素调用仿函数对象,它是整数(并不意味着是调用成员函数的对象)。如果这些元素的范围是 ss 类型的元素,它会工作(有点),但由于函数是用 ints 调用的,它不会工作.为了避免这种情况,我们必须在开始 std::transform 之前将成员函数 std::bind 到实例变量。

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

关于C++:对自己的结构使用mem fun,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com