将C ++成员函数指针传递给STL算法

时间:2015-05-20 15:56:42

标签: c++ stl member-functions stl-algorithm

我有一个成员函数如下:

class XYZ{
public:
    float function(float x);
private:
    float m_DensityMin;
    float m_DensityMax;
};

现在,我正在尝试使用std::vector<float> foo STL算法转换std::transform,方法是传递成员函数function,并将结果值存储在向量bar

如果我将函数用作全局函数,使用应该表示类成员变量的随机数据,它可以正常工作。

但是,由于函数需要使用类的成员变量m_DensityMinm_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对我来说无法使用,但无济于事。

3 个答案:

答案 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));
//                  ~~~~~~^      ~~~~~~^                  ~~~^

DEMO

答案 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";