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

Calling Functor in pair in array (C++)

我定义了一个数组:

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

其中 OpcodeArgument 是用于解释 Metafont GF 文件中数据的仿函数的基础 classes。典型的实现如下所示:

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文件中的每一个操作码。 (顺便说一句,输入上面的代码让我觉得我可能想使用自定义 class 代替 pair 这样我就不必重复引用 opcodes[opcode] 但这是进一步修订。)

我在 CLion 中注意到的是,它坚持要能够调用我的 operator(),它希望我写这样的东西:

int_fast32_t arg = opcodes[opcode].second->operator()(opcode);

所以两个问题:

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

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

  1. Is there a different/better way to manage my data structure so I don't have to explicitly call operator() like the above?

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

array<pair<std::reference_wrapper<OpCode>, std::reference_wrapper<Argument>>, 256> opcodes;
  1. Is there a more idiomatic structure I should be using to manage my Functors

如果您总是将它们链接起来,您可以明确地这样做:

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 对象不是那么大,您可以模板化函数并按值复制具体仿函数)。 }