你需要某种
双重调度
Visitor Pattern
我认为,你应该保留分子基和派生类。你应该在分子类中添加一个ID。并使用2D表实现双重调度,该表由2个对象的ID索引。如下所示:
class Molecule {
private:
int m_id;
public:
Molecule(int id) : m_id(id) { }
int id() const {
return m_id;
}
};
class LC: public Molecule {
private:
// members here
public:
LC() : Molecule(0) { }
};
class Col: public Molecule {
private:
// members here
public:
Col() : Molecule(1) { }
};
double potential_lc_vs_lc(const Molecule &a, const Molecule &b) {
const LC &lc_a = static_cast<LC &>(a);
const LC &lc_b = static_cast<LC &>(b);
// calculate potential LC (lc_a) vs LC (lc_b) here
return ...;
}
// all the potential_XX_vs_XX functions come here
const double (*potentialCalculatorTable[2][2])(const Molecule &, const Molecule &) = { { potential_lc_vs_lc, potential_lc_vs_col }, ... };
double calculatePotential(const Molecule &a, const Molecule &b) {
return (*potentialCalculatorTable[a.id()][b.id()])(a, b);
}
这需要一些手动管理,但解决方案很明确(在我看来),而且很快。