结合函子和
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采取你的函子作为一个参数,并使用绑定附加一个共同的实例到该参数?或者使用任意风格的组合函子
相关文章:
- 多态性和功能结合
- 将 Vulkan 与 SFML 结合使用?
- 将 c++ 生成器应用程序与外部 dll 结合使用
- 如何将增强MSM与增强信号结合使用?
- MS Visual Studio 解决方案结合了非托管C++项目和 C# 项目
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- C++ 将函数指针与最佳性能相结合
- 将 Lua 与 C++ DLL 结合使用
- 为什么push_back和emplace_back结合在一起时,会有不同的行为
- 将 aws-iot-device-sdk-cpp-v2 与 CMake 结合使用
- 将2个欧拉角与GLM相结合的问题
- 结合std::execution和OpenMP是否可取
- 抽象和派生与std::list相结合
- 想要将 CGAL 与四元数相结合是否合乎逻辑
- 存储/传递 v8 承诺解析器供以后使用的最佳实践?(结合C++线程)
- 如何将 IAudioClient3 (WASAPI) 与实时工作队列 API 结合使用
- 可变参数模板与默认模板参数相结合
- 函数与返回类型 node* 与 C++ 中的 OOP 结合使用
- 是否可以将C++与任何语言相结合?