如何解决在 lambda 中使用函子
我对在 C++ 中使用函子和 lambda 的一些语法很感兴趣。
我将函子定义为:
class paint : public OpCode {
public:
using OpCode::OpCode;
void operator()(std::int_fast32_t d) override {
if (character_context->is_black()) {
character_context->bitmap.add_blackline(character_context->m,character_context->n,d);
}
character_context->m += d;
character_context->toggle_color();
}
};
class get1byte : public Argument {
public:
using Argument::Argument;
int_fast32_t operator()() override {
return file_context->read1();
}
};
我可以通过执行来明确调用这些,例如,
paint _paint (characterContext);
get1byte _1byte (fileContext);
_paint(_1byte());
(或者至少可以编译)。
但后来我有
std::array<std::function<void()>,256> opcodes;
opcodes[64] = [_paint,_1byte](){ _paint(_1byte()); };
编译器抱怨,
No matching function for call to object of type 'const get1byte'
我如何让它按预期工作?我宁愿避免修改 OpCode
operator()
签名以采用 Argument
因为在某些情况下我想在参数中放入一个带有常量值的 lambda,例如, _paint
。
解决方法
多亏了 Remy Lebeau 的指导,我已经设法弄清楚我需要做什么:我必须将 const
添加到我的运算符函数的声明中,例如,
int_fast32_t operator()() const override {
return file_context->read1();
}
在 Argument
实现中,抽象基类将方法定义为
virtual std::int_fast32_t operator()() const = 0;
然后我就可以将我的作业写成例如
opcodes[64] = [=](){ _paint(_1byte()); };
一切都很好(或者至少不会产生编译器错误——我们会在我更新完代码后看到)。我什至设法使用 std::generate
改进了另一段代码,使 lambda 成为一个 lambda:
std::generate_n(opcodes.begin(),64,[&index,_paint](){ auto rv = [=](){_paint(index); }; ++index; return rv; });
如果运气好,一切都会好起来的(尽管我在填充的后面有类似的构造,我可能会将 lambda 重构为一个函数)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。