Да, есть. Идея состоит в том, чтобы использовать тип вместо логических (или числовых) выражений. Ваш случай довольно тривиален, но он полезен при работе с более сложными свойствами и более открыт для дальнейшего расширения.
Я добавлю еще один воображаемый тип эластичности «Чужой» только для демонстрации расширения .
Рассмотрим это:
// 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{});
}
};