我有一个成员函数如下:
class XYZ{
public:
float function(float x);
private:
float m_DensityMin;
float m_DensityMax;
};
现在,我正在尝试使用std::vector<float> foo
STL算法转换std::transform
,方法是传递成员函数function
,并将结果值存储在向量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
据我所知,我只传了一个论点。有什么指针吗? 这是一个类似的question,我尝试过使用std :: mem_fun,因为std :: mem_fn对我来说无法使用,但无济于事。
答案 0 :(得分:7)
std::mem_fun
本身只为成员函数提供了一个包装器,因此将在传递给其operator()
的第一个参数的上下文中调用一个。话虽如此,在将函数对象传递给bind算法之前,您需要std::transform
XYZ
的正确实例:
XYZ xyz;
std::transform(foo.begin(), foo.end(),
std::back_inserter(bar),
std::bind1st(std::mem_fun(&XYZ::function), &xyz));
// ~~~~~~^ ~~~~~~^ ~~~^
答案 1 :(得分:1)
除非函数是static
,否则它需要一个类的实例来调用该函数。因为非静态函数应该取决于该类的内部状态。如果函数独立于类的状态,它可能应该是静态的。
如果你必须按照书面形式离开你的课程,你可以默认构建XYZ
,只是为了让一个实例从中调用函数。
std::transform(foo.begin(),
foo.end(),
std::back_inserter(bar),
[](float a){ return XYZ{}.function(a); });
但这感觉很糟糕,如果函数不依赖于static
实例的状态,我希望函数为XYZ
,并且只取决于输入float
。
答案 2 :(得分:0)
lambda版
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";