gpt4 book ai didi

C++模板设计问题

转载 作者:太空狗 更新时间:2023-10-29 23:09:19 25 4
gpt4 key购买 nike

我有一个用 C++ 编写的模型,它基于运行时多态性和虚函数。该模型按原样工作得很好。我想研究将其转换为模板和编译时多态性。原因是:

  1. 模型中只有一个类在运行时是真正动态的,其余的都是编译时的决定。多态性纯粹是为了让模型的修改更简单、更灵活。
  2. 我想在模型中内联几个小函数,这对于虚函数是不可能的。

这是我的模型现在的样子的一个简化的假设示例:

class Particle
{
public:
// ...
virtual void move();
};

class Electron : public Particle { /*...*/ };


// Physics Models /////////////////////////////////

class PhysicsModel
{
public:
// ...
virtual void doStuffWithParticles();
private:
Particle* theParticle;
};

class NewtonPhysics : public PhysicsModel { /*...*/ };
class QuantumPhysics : public PhysicsModel { /*...*/ };


// SimulationModels ////////////////////////////

class SimulationModel
{
public:
virtual void runSimulation();
// ...
private:
PhysicsModel* thePhysics;
Particle* theParticle;
};

class HadronCollider : SimulationModel { /*...*/ };

但是假设我想内联粒子函数,例如 move(),因为它是一系列 for 循环的内部循环,并且可以从速度红利中获益匪浅。在编译时,我知道我正在运行什么物理模型和仿真模型,但粒子是运行时决定的。

那么,怎么样:

template <typename TParticleType>
class PhysicsModel
{
// ...
TParticleType theParticle;
};

template <typename TParticleType,
typename TPhysicsModelType>
class SimulationModel
{
TParticleType theParticle;
TPhysicsModelType theModel;
};

好的,到目前为止一切顺利。但是现在让我们说在编译时我已经决定我们正在使用运行强子模拟和量子物理模型,并且我们正在读取粒子的输入文件。我想避免这种味道:

int main()
{
// ...
switch( getUserInput()->currentParticleType )
{
case ELECTRON: HadronSimulation<Electron, QuantumPhysics>.run();
case PROTON: HadronSimulation<Proton, QuantumPhysics>.run();
// ...
}
}

... 并且宁愿将“QuantumPhysics”类型放在其他地方,这样它就在同一个地方。这是一个过于简单的例子,实际上我会有大约 4-5 个参数,它们是编译时的决定。

基本上,我正在寻找一种允许我将运行时参数放入此类模板框架中的设计。有没有好的方法来做到这一点?如果这看起来像一个愚蠢的问题,请道歉,但我对 C++ 中的模板完全陌生。提前致谢。

最佳答案

静态和动态多态性不能很好地混合,并且在它们相互作用的地方,需要某种形式的分支来将运行时信息转换为静态配置变体之间的选择。你可以使用一个简单的 type generator至少减少物理模型的重复:

template< class Particle >
class HadronSimulationGenerator {
public:
typedef HadronSimulation< Particle, QuantumPhysics > type;
};

int main()
{
// ...
switch( getUserInput()->currentParticleType )
{
case ELECTRON: HadronSimulationGenerator<Electron>::type.run();
case PROTON: HadronSimulationGenerator<Proton>::type.run();
// ...
}
}

没那么漂亮。

关于C++模板设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5546957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com