C++ 将整型常量映射到类型

C++ 将整型常量映射到类型,c++,c++11,c++14,c++17,C++,C++11,C++14,C++17,我正在讨论,它演示了一个有用的概念,即对整数值进行类型化,以允许编译时调度: template <int Val> struct Elastic { enum {V = Val}; }; template <class Object, bool isElastic> class ImpactMomentum { double calc_momentum(double v_in, Elastic<true> /* */) {

我正在讨论,它演示了一个有用的概念,即对整数值进行类型化,以允许编译时调度:

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++实现取代了这个成语?当函数的参数列表中有多个要切换的标志时,它可以很好地伸缩

是的,有。其思想是使用类型而不是布尔或数字表达式。您的案例相当琐碎,但在处理更复杂的属性时会有所帮助,并且对于以后的扩展更为开放

我将添加另一个虚构的弹性类型外星人,只是为了演示扩展

考虑这一点:

// 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{});
    }
};

是的,有。其思想是使用类型而不是布尔或数字表达式。您的案例相当琐碎,但在处理更复杂的属性时会有所帮助,并且对于以后的扩展更为开放

我将添加另一个虚构的弹性类型外星人,只是为了演示扩展

考虑这一点:

// 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{});
    }
};

我不认为有任何东西会完全否定它的有用性,但是如果可以使用constexpr,如果两者之间的代码差异使它更适合,也许这就是你所寻找的。我不认为有任何东西会完全否定它的有用性,但是,如果可以使用constexpr,如果代码之间的差异使其更适合,则可能是您所寻找的。您所描述的模式将允许每个参数有更多变化,但我已经能够做到这一点。我可以用int来代替bool。如果你有几个你想专门研究的参数,这将很难扩展,因为会有很多常见的样板代码。我可能误解了你的建议?也许。。。许多人都使用这种模式。请注意,它不仅允许包含数据的属性,还允许从属性派生以进行进一步专门化。可以添加样板代码的一件事是代码的结构和组织方式,弹性更适合作为对象本身的属性。也许将其作为PhysicalObject类的属性会更有意义。毕竟,calc_动量是一个函数,而不是一个对象类型。我没有把这个分析包含在答案中,因为这超出了问题的范围。至于样板代码,欢迎使用C++。更高层次的概念和强大的构造使得代码的其余部分更容易保持无bug,更容易推理,读写也更容易更快,必须在某个时候声明。您描述的模式将允许每个参数有更多的变化,但我已经能够做到。我可以用int来代替bool。如果你有几个你想专门研究的参数,这将很难扩展,因为会有很多常见的样板代码。我可能误解了你的建议?也许。。。许多人都使用这种模式。请注意,它不仅允许包含数据的属性,还允许从属性派生以进行进一步专门化。可以添加样板代码的一件事是代码的结构和组织方式,弹性更适合作为对象本身的属性。也许将其作为PhysicalObject类的属性会更有意义。毕竟,calc_动量是一个函数,而不是一个对象类型。我没有把这个分析包含在答案中,因为这超出了问题的范围。至于样板代码,欢迎使用C++。更高层次的概念和强大的构造使得代码的其余部分更容易保持无bug,更容易推理,读写也更容易更快,必须在某个时候声明。