所以我正在开发一个 2D 空间模拟器,并且我有资源管理器' calc
'来处理所有计算。例如,来自calc.hpp
:
var calc::eccentricity (object A, object B);
var calc::distance (object A, object B);
var calc::orbitV (object A, object B);
等等。但是,我的程序结构方式是在我的calc
课堂上
private:
object *ship //the currently controlled ship
object *targ //target
object *ref //reference (from which speeds, position, etc. are calculated)
为了使用第一个示例中给出的计算,我为每个计算函数编写了三个函数,如下所示:
var calc::ship_ecc (object A){
if(!ship) //catches null pointers
return NAN;
return eccentricity(*ship, A);
}
var calc::ship_ref_ecc (){
if(!ref) //catches null pointers
return NAN;
return ship_ecc(*ref);
}
var calc::ship_targ_ecc (){
if(!targ) //catches null pointers
return NAN;
return ship_ecc(*targ);
}
对于eccentricity
,然后对于distance
和也是一样的orbitV
。所以我最终为每个计算提供了四个函数。正如你所看到的,calc.hpp
这会产生大量重复的代码。重复的代码是一件坏事。
我的问题是
有什么方法可以打电话
calc.ship.targ.eccentricity();
calc.ship.ref.eccentricity(); //or variation thereof
或者
calc.ship.targ(eccentricity);
calc.ship.ref(eccentricity); //or variation thereof
代替
calc.ship_targ_ecc();
calc.ship_ref_ecc();
? 我想知道你是否可以做一些花哨operator()
的重载,或者传递一个函数,或者friend
在calc
. 理想情况下,我应该只能访问31 - 53
所有线路public
。
谢谢!
编辑:有一个例子:https ://ideone.com/jypJQS这是它应该输出的内容以及它现在是如何工作的