微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在数组中成对调用 Functor (C++)

如何解决在数组中成对调用 Functor (C++)

我已经定义了一个数组:

std::array<std::pair<std::shared_ptr<OpCode>,std::shared_ptr<Argument>>,256> opcodes;

其中 OpcodeArgument 是用于解释 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);

所以两个问题:

  1. 是否有不同/更好的方法来管理我的数据结构,这样我就不必像上面那样显式调用 operator()

  2. 是否应该使用更惯用的结构来管理我的函子(假设它们甚至是完成这项工作的正确工具)以启用单步执行 GF 字节码?

解决方法

  1. 是否有不同/更好的方法来管理我的数据结构,以便我不必像上面那样显式调用 operator()?

好吧,如果您不存储指针,则不需要取消引用它们。例如,如果您的函子是享元,您就不需要到处存储拥有指针,只需使用

array<pair<std::reference_wrapper<OpCode>,std::reference_wrapper<Argument>>,256> opcodes;
  1. 是否应该使用更惯用的结构来管理我的函子

如果你总是链接它们,你可以明确地这样做:

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)); }
}

(显然可以使用原始指针、共享指针、引用,如果你确定对象生命周期在其他地方得到保证......或者如果 OpCodeArgument 对象不是那么大,你可以对函数进行模板化,然后按值复制具体的函子)。 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。