C++ 在数组(C+;+;)中成对调用函子
我已将数组定义为:C++ 在数组(C+;+;)中成对调用函子,c++,functor,C++,Functor,我已将数组定义为: std::array<std::pair<std::shared_ptr<OpCode>, std::shared_ptr<Argument>>, 256> opcodes; 我希望能够做到以下几点: opcodes[opcode].first(opcodes[opcode].second(opcode)); 解释GF文件中的每个操作码。(顺便说一句,键入上面的代码让我觉得我可能想使用自定义类来代替pair,这样我就不必重复
std::array<std::pair<std::shared_ptr<OpCode>, std::shared_ptr<Argument>>, 256> opcodes;
我希望能够做到以下几点:
opcodes[opcode].first(opcodes[opcode].second(opcode));
解释GF文件中的每个操作码。(顺便说一句,键入上面的代码让我觉得我可能想使用自定义类来代替pair
,这样我就不必重复引用opcode[opcode]
,但这是为了进一步修订。)
我在CLion中注意到的是,它坚持认为,为了能够调用我的操作符()
,它希望我编写如下内容:
int_fast32_t arg = opcodes[opcode].second->operator()(opcode);
所以有两个问题:
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)); }
}
数组操作码;
void bind_操作码(int_fast32_t op,操作码*foo,参数*bar)
{
操作码[op]=[=](int_fast32_t x){(*foo)((*bar)(x));}
}
(显然,如果您确定对象的生命周期在其他地方得到保证,那么可以使用原始指针、共享指针和引用……或者如果OpCode
和参数
对象没有那么大,您可以对函数进行模板化,只需按值复制具体的函子即可)。
}
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)); }
}
数组操作码;
void bind_操作码(int_fast32_t op,操作码*foo,参数*bar)
{
操作码[op]=[=](int_fast32_t x){(*foo)((*bar)(x));}
}
(显然,如果您确定对象的生命周期在其他地方得到保证,那么可以使用原始指针、共享指针和引用……或者如果OpCode
和参数
对象没有那么大,您可以对函数进行模板化,只需按值复制具体的函子即可)。
}尝试使用
(操作码[opcode].first)(操作码[opcode].second(操作码))代码>?@NathanOliver第一个和第二个是指针,一些*
缺少Ithink@largest_prime_is_463035818啊哈。没错。最有可能的是(*opcode[opcode]。第一个)(opcode[opcode]。第二个(opcode))代码>可以。现在我不确定这个问题到底是关于什么的。是不是只有x->operator()(…)
vs(*x)(…)
这件事让你感到不安?请注意,寻求不同/更好的方法是基于边缘观点的。@NathanOliversecond
也是一个指针;)尝试使用(操作码[opcode].first)(操作码[opcode].second(操作码))代码>?@NathanOliver第一个和第二个是指针,一些*
缺少Ithink@largest_prime_is_463035818啊哈。没错。最有可能的是(*opcode[opcode]。第一个)(opcode[opcode]。第二个(opcode))代码>可以。现在我不确定这个问题到底是关于什么的。是不是只有x->operator()(…)
vs(*x)(…)
这件事让你感到不安?请注意,寻求不同/更好的方法是基于边缘观点的。@NathanOliversecond
也是一个指针;)我看得越多,从你的答案中学到的东西就越多。我希望我能不止一次投票支持它。特别是让数组成为std::function
中的一个,我可以用它来重构东西。大多数参数
函子实际上并没有使用它们的参数,而使用它们的函子通常只返回裸操作码(例如,操作码0–63相当于绘制(操作码)
,我可以用操作码(或操作码减去常量)创建lambda而不是使用函子。因为你的答案,我的代码明显更好。我真的很高兴它起到了作用!我看得越多,从你的答案中学到的东西就越多。我希望我能不止一次地对它进行投票。特别是关于让数组成为一个std::function
的想法,我可以用它来重构东西。大多数Argument
函子实际上不使用参数,而那些使用参数的函子通常只返回裸操作码(例如,操作码0–63相当于绘制(操作码)
,我可以用操作码(或操作码减去常数)创建lambda而不是使用函子。因为你的回答,我的代码更好。我真的很高兴它有帮助!