如何解决在数组中成对调用 Functor (C++)
我已经定义了一个数组:
std::array<std::pair<std::shared_ptr<OpCode>,std::shared_ptr<Argument>>,256> opcodes;
其中 Opcode
和 Argument
是用于解释 Metafont GF 文件中数据的函子的基类。典型的实现如下所示:
class skip: public OpCode {
public:
using OpCode::OpCode;
void operator()(std::int_fast32_t argument) override {
character_context->next_line(argument);
character_context->make_white();
}
};
我希望能够执行以下操作:
opcodes[opcode].first(opcodes[opcode].second(opcode));
解释 GF 文件中的每个操作码。 (顺便说一句,输入上面的代码让我觉得我可能想要使用自定义类来代替 pair
,这样我就不必重复引用 opcodes[opcode]
但是这是进一步修订。)
我在 CLion 中注意到的是,它坚持要能够调用我的 operator()
,它希望我改写这样的内容:
int_fast32_t arg = opcodes[opcode].second->operator()(opcode);
所以两个问题:
-
是否应该使用更惯用的结构来管理我的函子(假设它们甚至是完成这项工作的正确工具)以启用单步执行 GF 字节码?
解决方法
- 是否有不同/更好的方法来管理我的数据结构,以便我不必像上面那样显式调用 operator()?
好吧,如果您不存储指针,则不需要取消引用它们。例如,如果您的函子是享元,您就不需要到处存储拥有指针,只需使用
array<pair<std::reference_wrapper<OpCode>,std::reference_wrapper<Argument>>,256> opcodes;
- 是否应该使用更惯用的结构来管理我的函子
如果你总是链接它们,你可以明确地这样做:
array<std::function<void(int_fast32_t)>,256> opcodes;
void bind_opcode(int_fast32_t op,OpCode* foo,Argument* bar)
{
opcodes[op] = [=](int_fast32_t x) { (*foo)((*bar)(x)); }
}
(显然可以使用原始指针、共享指针、引用,如果你确定对象生命周期在其他地方得到保证......或者如果 OpCode
和 Argument
对象不是那么大,你可以对函数进行模板化,然后按值复制具体的函子)。
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。