在数组中成对调用 Functor (C++)
Calling Functor in pair in array (C++)
我定义了一个数组:
std::array<std::pair<std::shared_ptr<OpCode>, std::shared_ptr<Argument>>, 256> opcodes;
其中 Opcode
和 Argument
是用于解释 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);
所以两个问题:
是否有 different/better 方法来管理我的数据结构,这样我就不必像上面那样显式调用 operator()
?
我应该使用更惯用的结构来管理我的 Functors(假设它们甚至是完成这项工作的正确工具)以支持单步执行 GF 字节码吗?
- 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;
- 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)); }
}
(显然可以使用原始指针、共享指针、引用,如果你确定对象的生命周期在别处得到保证......或者如果 OpCode
和 Argument
对象不是那么大,您可以模板化函数并按值复制具体仿函数)。
}
我定义了一个数组:
std::array<std::pair<std::shared_ptr<OpCode>, std::shared_ptr<Argument>>, 256> opcodes;
其中 Opcode
和 Argument
是用于解释 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);
所以两个问题:
是否有 different/better 方法来管理我的数据结构,这样我就不必像上面那样显式调用
operator()
?我应该使用更惯用的结构来管理我的 Functors(假设它们甚至是完成这项工作的正确工具)以支持单步执行 GF 字节码吗?
- 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;
- 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)); }
}
(显然可以使用原始指针、共享指针、引用,如果你确定对象的生命周期在别处得到保证......或者如果 OpCode
和 Argument
对象不是那么大,您可以模板化函数并按值复制具体仿函数)。
}