Отображение целых констант на типы - PullRequest
1 голос
/ 25 мая 2020

Я просматриваю книгу Александреску , и в ней демонстрируется полезная концепция типизации целочисленных значений для отправки во время компиляции:

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 ++, которая заменяет эта идиома? Что-то, что хорошо масштабируется, когда есть несколько флагов для переключения в списке аргументов функции.

1 Ответ

3 голосов
/ 26 мая 2020

Да, есть. Идея состоит в том, чтобы использовать тип вместо логических (или числовых) выражений. Ваш случай довольно тривиален, но он полезен при работе с более сложными свойствами и более открыт для дальнейшего расширения.

Я добавлю еще один воображаемый тип эластичности «Чужой» только для демонстрации расширения .

Рассмотрим это:

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