Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;模板设计问题 我有一个C++模型,它是基于运行时多态性和虚拟函数的。这个模型完全可以正常工作。我想研究将其转换为模板和编译时多态性。原因是: 模型中只有一个类在运行时是真正动态的,其余的是编译时决策。多态性纯粹是为了使模型中的更改更容易、更灵活 我想在模型中内联几个小函数,这在虚拟函数中是不可能的_C++_Templates_Virtual - Fatal编程技术网

C++;模板设计问题 我有一个C++模型,它是基于运行时多态性和虚拟函数的。这个模型完全可以正常工作。我想研究将其转换为模板和编译时多态性。原因是: 模型中只有一个类在运行时是真正动态的,其余的是编译时决策。多态性纯粹是为了使模型中的更改更容易、更灵活 我想在模型中内联几个小函数,这在虚拟函数中是不可能的

C++;模板设计问题 我有一个C++模型,它是基于运行时多态性和虚拟函数的。这个模型完全可以正常工作。我想研究将其转换为模板和编译时多态性。原因是: 模型中只有一个类在运行时是真正动态的,其余的是编译时决策。多态性纯粹是为了使模型中的更改更容易、更灵活 我想在模型中内联几个小函数,这在虚拟函数中是不可能的,c++,templates,virtual,C++,Templates,Virtual,下面是我的模型现在的简化假设示例: class Particle { public: // ... virtual void move(); }; class Electron : public Particle { /*...*/ }; // Physics Models ///////////////////////////////// class PhysicsModel { public: // ... virtual void doStuffWithParti

下面是我的模型现在的简化假设示例:

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;
};
模板
类物理模型
{
// ...
t部件类型为该部件;
};
模板
类模拟模型
{
t部件类型为该部件;
t物理模型类型模型;
};
好的,到目前为止还不错。但现在让我们假设在编译时,我已经决定使用量子物理模型运行强子模拟,我们正在读取粒子的输入文件。我想避免这种味道:

int main()
{ 
  // ...
  switch( getUserInput()->currentParticleType )
  {
     case ELECTRON:  HadronSimulation<Electron, QuantumPhysics>.run();
     case PROTON:    HadronSimulation<Proton, QuantumPhysics>.run();
     // ...
  }
}
intmain()
{ 
// ...
开关(getUserInput()->currentParticleType)
{
case-ELECTRON:HadronSimulation.run();
案例质子:强子模拟。运行();
// ...
}
}
。。。更愿意把“量子物理学”类型放在其他地方,这样它就在同一个地方。这是一个过于简化的示例,实际上我有大约4-5个参数,它们是编译时决策


基本上,我正在寻找一种设计,它允许我将运行时参数放入这种模板框架中。有什么好办法吗?道歉,如果这看起来像一个愚蠢的问题,但我完全陌生的模板在C++中。提前感谢。

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

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();
     // ...
  }
}
模板
类强子模拟发生器{
公众:
typedef强子模拟类型;
};
int main()
{ 
// ...
开关(getUserInput()->currentParticleType)
{
case-ELECTRON:HadronSimulationGenerator::type.run();
案例:强子模拟生成器::type.run();
// ...
}
}

不太漂亮。

在第一个示例中(没有模板),您是如何修复
物理模型
粒子类型的?构造函数是否负责实例化这两者?如果是,那么您可以使用类似的技术,通过在
SimulationModel
的构造函数中执行
开关来向用户隐藏这一点

class SimulationModel {
    void run() {
        switch(currentPhysicsMode) {
        case QUANTUM:
            switch(currentParticleType) {
                case ELECTRON:
                    SimulationModelImpl<Electron, QuantumPhysics>::run();
                    break;
                case PROTON:
                    SimulationModelImpl<Proton, QuantumPhysics>::run();
                    break;
                ...
            }
        }
    }
};

template <typename TParticleType,
      typename TPhysicsModelType>
class SimulationModelImpl {
    TParticleType theParticle;
    TPhysicsModelType theModel;
    ...
};
类模拟模型{
无效运行(){
开关(当前物理模式){
案例数量:
开关(currentParticleType){
外壳电子:
SimulationModelImpl::run();
打破
案例质子:
SimulationModelImpl::run();
打破
...
}
}
}
};
模板
类模拟ModelImpl{
t部件类型为该部件;
t物理模型类型模型;
...
};

“宁愿将“QuantumPhysics”类型放在其他地方,这样它就在同一个地方”。。。typedef可以创建单个维护点:
typedef QuantumPhysicsModel。这就是你想要的吗?嗨,托尼,谢谢你的回复。我认为这可能会起作用,但直觉上我觉得应该更明确地将编译类型参数与运行时参数分开。我认为我没有很好地说明在main()函数中各部分应该如何组合在一起……Is
HadronSimulation
aka
HadronCollider
?还有
SimulationModel.runSimulation()
aka
run()
?您好,谢谢您的回复。这在概念上比使用typedef更符合我的要求,但另一方面,typedef方法似乎更简单。我需要更多地考虑这一点。您可以用运行时间来换取开发人员时间。类型生成器与模板类型驱动的分派或双重分派相结合,将为您带来最大的收益。在这方面,您可能会发现Alexandrescu的“现代C++设计”第8章和第9章。