2014-10-03 6 views
0

Я хотел бы перегружать определенный пользователь литералы, так что это позволит выполнять некоторые физические расчеты, напримерВозможно ли реализовать производные единицы системы СИ с использованием пользовательских литералов?

auto force = 5_N;   // force in newton 
auto distance = 6.8_m; // distance in meters 

auto resultingEnergy = force * distance; // expected result in joules 

Как это может быть достигнут?

+2

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

+2

Вы можете посмотреть [Boost.Units] (http://www.boost.org/doc/libs/1_56_0/doc/html/boost_units.html) для вдохновения и в основном сделать пользовательские литералы возвратить соответствующее Boost. Типы единиц. – Angew

ответ

1

Вы можете определить некоторые новые типы (или использовать подталкивание единицу, как указаны выше),

Определенного пользователь решения может быть аналогично:

#define DECLARE_UNIT(UnitName) \ 
struct UnitName { \ 
    UnitName(const long double val) noexcept : val_(val) {};\ 
    long double val_ = 0.0; \ 
}; 

DECLARE_UNIT(Joule); 
DECLARE_UNIT(Newton); 
DECLARE_UNIT(Meters); 

const Newton operator""_N(const long double n) noexcept { 
    return Newton(n); 
} 
const Meters operator""_m(const long double m) noexcept { 
    return Meters(m); 
} 

const Joule operator*(const Newton& newtons, const Meters& meters) noexcept { 
    return newtons.val_ * meters.val_; 
} 


int main() { 
    auto force = 5.0_N; 
    auto distance = 6.8_m; 
    auto energy = force * distance; // of Joule type 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^