结合函子和

Combining functors and lambdas

本文关键字:结合      更新时间:2023-10-16

我有一个函子,创建一个线性间隔的一组值…

//Linear spaced generator
struct gen_lin {
    float mi, inc;
public:
    gen_lin(float _mi=1.f, float _inc=1.f) : mi(_mi), inc(_inc){};
    float operator()() {
        return  mi+=inc;
    }
};

我可以用这样的值填充一个向量…

const size_t elements = 400;
std::vector<float> x(elements);
std::generate_n(x.begin(), elements, gen_lin(10.f,5.f) );

现在,我可以很容易地将其转换为对数刻度使用lambda如下…

auto lin = gen_lin(10.f,5.f);
std::generate_n(x.begin(), elements, [&](){return logf(lin());} );

但是当我试图把它全部挤到一行上时,向量完全被logf(10.)

的值填满了。
std::generate_n(x.begin(), elements, [](){return logf(  gen_lin(10.f,5.f)() );} );

为什么,是否有可能调整我的最后一行代码使其工作?

这样,您就创建了一个单一的gen_lin对象,并多次使用它:

auto lin = gen_lin(10.f,5.f);
std::generate_n(x.begin(), elements, [&](){return logf(lin());} );

这样,您将创建几个gen_lin对象:

std::generate_n(x.begin(), elements, [](){return logf(  gen_lin(10.f,5.f)() );} );

每次创建新的gen_lin对象时,当前值将被重置。

在第一种情况下:

auto lin = gen_lin(10.f,5.f);
std::generate_n(x.begin(), elements, [&](){return logf(lin());} );

您有一个持久的gen_lin对象lin,它在每次调用lambda时都会更新。但是在您的一行代码中,您只是在每次调用lambda时创建新的gen_lin对象,获得它返回的第一个值,然后将对象丢弃。因为它是一个新对象,用相同的常量值初始化,所以它每次都会给你相同的值。

对于第二种情况,每个lambda调用都会创建一个函子的新实例。

像bind这样的东西可能会解决你的问题。使lambda采取你的函子作为一个参数,并使用绑定附加一个共同的实例到该参数?

或者使用任意风格的组合函子