【问题标题】:Mapping integral constants to types将整数常量映射到类型
【发布时间】:2020-05-25 17:55:00
【问题描述】:

我正在浏览Alexandrescu's book,它演示了典型整数值以允许编译时调度的有用概念:

template <int Val>
struct Elastic
{
    enum {V = Val};
};

template <class Object, bool isElastic>
class ImpactMomentum
{
    double calc_momentum(double v_in, Elastic<true> /*  */)
    {
        // compute elastic ...
    }

    double calc_momentum(double v_in, Elastic<false> /*  */)
    {
        // compute rigid ...
    }
 public:
    double calc_momentum(double v_in)
    {
        calc_velocity(v_in, Elastic<isElastic>());
    }
};

是否有取代这个习语的现代 C++ 实现?当函数的参数列表中有多个标志可以切换时,可以很好地扩展。

【问题讨论】:

  • 我认为没有什么可以完全否定它的用处,但是如果代码之间的差异使得它更合适,可以使用if constexpr
  • 也许integral constant 就是你要找的。​​span>

标签: c++ c++11 c++14 c++17


【解决方案1】:

是的,有。这个想法是使用类型而不是布尔(或数字)表达式。您的案例相当琐碎,但在处理更复杂的属性时很有帮助,并且对以后的扩展更加开放。

我将添加另一个虚构的弹性类型“Alien”,只是为了演示扩展。

考虑一下:

// empty types
struct Elastic { enum {V = Val}; };
struct Rigid   {};
struct Alien   {};

template <class Object, class Elasticity>
class ImpactMomentum
{
    // for libraries wanting to give users even more expansion options, 
    // without modifying the library, these specializations could be 
    // regular free functions also taking *this as a parameter, for 
    // example.

    double calc_momentum(double v_in, Elastic)  // or const & if property has data
    {
        // ...
    }

    double calc_momentum(double v_in, Rigid)
    {
        // ...
    }

    double calc_momentum(double v_in, Alien)
    {
        // ...
    }

 public:
    double calc_momentum(double v_in)
    {
        return calc_velocity(v_in, Elasticity{});
    }
};

【讨论】:

  • 您描述的模式将允许每个参数有更多变化,但我已经能够做到。我本可以用典型的 int 代替 bool。如果您有几个想要专门研究的参数,这将很难扩展,因为会有很多常见的样板代码。我可能误解了你的建议?
  • 也许...这种模式被许多人使用。请注意,它不仅允许具有数据的属性,而且还允许从属性派生以进行进一步的专业化。可能添加样板代码的一件事是代码的结构化和组织方式,弹性将更适合作为对象本身的属性。也许将它作为 PhysicalObject 类的属性会更有意义。毕竟, calc_momentum 是一个函数,而不是一个对象类型。我没有在答案中包含此分析,因为这超出了问题的范围。
  • 至于样板代码,欢迎使用 C++。更高层次的概念和强大的结构使得其余代码更容易保持无错误、更容易推理、更容易和更快地读写,必须在某个地方声明。
猜你喜欢
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
相关资源
最近更新 更多