将c++成员函数指针传递给STL算法
Passing a C++ Member Function Pointer to an STL Algorithm
我有一个成员函数如下:
class XYZ{
public:
float function(float x);
private:
float m_DensityMin;
float m_DensityMax;
};
现在,我试图通过传递成员函数function
来使用std::transform
STL算法转换std::vector<float> foo
,并将结果值存储在向量bar
中。
如果我将函数用作全局函数,并使用随机数据表示类的成员变量,则可以正常工作。
但是,由于函数需要使用类的成员变量m_DensityMin
和m_DensityMax
,所以我需要将其作为成员函数使用。这是我尝试过的:
std::transform(foo.begin(), foo.end(), bar.begin(), &XYZ::function);
,但我最终与错误在VS2010:
error C2065: term does not evaluate to a function taking 1 arguments
据我所知,我只传递了一个参数。指针吗?这里有一个类似的问题,我尝试过std::mem_fun,因为std::mem_fn对我来说不可用,但无济于事。
std::mem_fun
本身仅为成员函数提供包装器,因此将在传递给其operator()
的第一个参数的上下文中调用成员函数。话虽如此,在将函数对象传递给std::transform
算法之前,您需要绑定XYZ
的适当实例:
XYZ xyz;
std::transform(foo.begin(), foo.end(),
std::back_inserter(bar),
std::bind1st(std::mem_fun(&XYZ::function), &xyz));
// ~~~~~~^ ~~~~~~^ ~~~^
除非函数是static
,否则它需要一个类的实例来调用该函数。因为非静态函数应该依赖于该类的内部状态。如果函数独立于类的状态,那么它应该是静态的。
如果你必须让你的类保持原样,你可以通过默认构造一个XYZ
来绕过这个问题,只是为了有一个实例来调用函数。
std::transform(foo.begin(),
foo.end(),
std::back_inserter(bar),
[](float a){ return XYZ{}.function(a); });
但这感觉很hacky,我宁愿函数是static
,如果它不依赖于XYZ
实例的状态,只依赖于输入float
。
lambda version
std::vector<float> foo;
std::vector<float> bar;
foo.push_back(1.0f);
foo.push_back(2.0f);
XYZ xyz;
std::transform(foo.begin(), foo.end(), std::back_inserter(bar),
[&xyz](float& a){ return xyz.function(a); });
for ( auto & x : bar)
std::cout<<x<<"n";
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- STL算法函数在多个一维容器上的使用
- C++:尝试使用等效的 STL 算法消除原始循环
- STL算法和back_inserter可以预分配空间吗?
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- C++ - 如何使用<int> <int>STL 算法功能在矢量<vector>中找到矢量?
- 如何在变量容器上使用stl算法
- 在 stl 算法中移动迭代器
- 如何使用 STL 算法找到最小值和最大值?
- C STL算法相等
- 在 stl 算法中使用函数对象
- 重新定义要在字符串的 STL 算法中使用的<运算符
- 将 STL 算法与 Qt 容器结合使用
- 使用STL算法合并2个向量
- STL算法函数,如累加,如果传递给它们的函数接受引用,请避免复制
- 什么 STL 算法可以确定容器中的一个项目是否满足谓词?
- c ++ 是否有 STL 算法来检查范围是否严格排序
- begin() 和 end() 用于 STL 算法
- STL算法并嵌套以循环