template typename V 1 typename V 2 typename

  • Slides: 24
Download presentation

Сабирање и одузимање Прости случајеви template < typename V 1, typename V 2, typename.

Сабирање и одузимање Прости случајеви template < typename V 1, typename V 2, typename. . . Ts> auto operator+(const Physical. Unit<V 1, Ts. . . > &lhs, const Physical. Unit<V 2, Ts. . . > &rhs) -> Physical. Unit<decltype(lhs. value() + rhs. value()), Ts. . . > { return Physical. Unit<decltype(lhs. value() + rhs. value()), Ts. . . >(lhs. value() + rhs. value()); } • Налик поређењима, сабирамо и одузимамо вредности истих димензија, али закључујемо који је повратни тип Димензионa анализа у језику C++ 29/03/2021 | Nikola Jelić Public | Slide 12 |© Zuhlke 2021

Множење и дељење I Рад са скаларима, једноставан случај template <typename V 1, typename

Множење и дељење I Рад са скаларима, једноставан случај template <typename V 1, typename V 2, typename. . . Ts> constexpr auto operator*(const V 1 &lhs, const Physical. Unit<V 2, Ts. . . > &rhs) -> Physical. Unit<decltype(lhs * rhs. value()), Ts. . . > { return Physical. Unit<decltype(lhs * rhs. value()), Ts. . . >(lhs * rhs. value()); } • Множење • Опет је лако, док је дељење лако само ако делимо скаларом закључујемо тип Димензионa анализа у језику C++ 29/03/2021 | Nikola Jelić Public | Slide 13 |© Zuhlke 2021

Множење и дељење II Рад са скаларима, тежи случај template <typename V 1, typename

Множење и дељење II Рад са скаларима, тежи случај template <typename V 1, typename V 2, typename F, typename LD, typename MD, typename TD, typename ED, typename TMD, typename AD, typename LUD, > constexpr auto operator/(const V 1 &lhs, const Physical. Unit<V 2, F, LD, MD, TD, ED, TMD, AD, LUD> &rhs) -> Physical. Unit<decltype(lhs / rhs. value()), std: : ratio_divide<std: : ratio<1>, F>, std: : ratio_subtract<std: : ratio<0>, LD>, …> { return Physical. Unit<decltype(lhs / rhs. value()), std: : ratio_divide<std: : ratio<1>, F>, std: : ratio_subtract<std: : ratio<0>, LD>, …> (lhs / rhs. value()); } • Повратни Димензионa анализа у језику C++ тип изводимо инверзијом фактора и негацијом димензија 29/03/2021 | Nikola Jelić Public | Slide 14 |© Zuhlke 2021

Множење и дељење III Рад са осталим физичким вредностима template <typename V 1, typename

Множење и дељење III Рад са осталим физичким вредностима template <typename V 1, typename F 1, typename LD 1, …, typename V 2, typename F 2, typename LD 2, …> constexpr auto operator*(const Physical. Unit<V 1, F 1, LD 1, …> &lhs, const Physical. Unit<V 2, F 2, LD 2, …> &rhs) -> Physical. Unit<decltype(lhs. value() * rhs. value()), std: : ratio_multiply<F 1, F 2>, std: : ratio_add<LD 1, LD 2>, …> { return Physical. Unit<decltype(lhs. value() * rhs. value()), std: : ratio_multiply<F 1, F 2>, std: : ratio_add<LD 1, LD 2>, …>(lhs. value() * rhs. value()); } • Налик раду са скаларима, али обе вредности имају димензије и факторе Димензионa анализа у језику C++ 29/03/2021 | Nikola Jelić Public | Slide 15 |© Zuhlke 2021

Основна апсолутна јединица template <typename Val. Type, typename Diff. Type, typename Factor, typename Len.

Основна апсолутна јединица template <typename Val. Type, typename Diff. Type, typename Factor, typename Len. Dim, typename Mass. Dim, typename Time. Dim, typename Elcur. Dim, typename Temp. Dim, typename Amm. Dim, typename Lum. Dim> class Absolute. Physical. Unit { public: using Diff. Physical. Unit = Physical. Unit<Diff. Type, Factor, Len. Dim, Mass. Dim, Time. Dim, Elcur. Dim, Temp. Dim, Amm. Dim, Lum. Dim>; …} • Установљујемо однос између апсолутне јединице (нпр. време) и физичке јединице којом меримо разлику између апсолутних вредности (нпр. временску разлику меримо данима, сатима или секундама) Димензионa анализа у језику C++ 29/03/2021 | Nikola Jelić Public | Slide 18 |© Zuhlke 2021

Одузимање две апсолутне вредности class Absolute. Physical. Unit { constexpr Diff. Physical. Unit operator-(const

Одузимање две апсолутне вредности class Absolute. Physical. Unit { constexpr Diff. Physical. Unit operator-(const Absolute. Physical. Unit& rhs) const { return Diff. Physical. Unit(value() - rhs. value()); }…} • Једноставна Димензионa анализа у језику C++ имплементација, пошто шаблони раде већину посла 29/03/2021 | Nikola Jelić Public | Slide 19 |© Zuhlke 2021

Додавање апсолутне и релативне вредности template <typename Val. Type, typename. . . Ts> constexpr

Додавање апсолутне и релативне вредности template <typename Val. Type, typename. . . Ts> constexpr Absolute. Physical. Unit<Val. Type, Ts. . . > operator+(const Physical. Unit<Ts. . . >& lhs, const Absolute. Physical. Unit<Val. Type, Ts. . . >& rhs) { return Absolute. Physical. Unit<Val. Type, Ts. . . >(lhs. value() + rhs. value()); } • Такође једноставно, захваљујући шаблонима Димензионa анализа у језику C++ 29/03/2021 | Nikola Jelić Public | Slide 20 |© Zuhlke 2021

Сажетак Димензионa анализа у језику C++ 29/03/2021 | Nikola Jelić Public | Slide 22

Сажетак Димензионa анализа у језику C++ 29/03/2021 | Nikola Jelić Public | Slide 22 |© Zuhlke 2021