// Copyright Louis Dionne 2013-2017 // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include namespace hana = boost::hana; // // Example of implementing basic dimensional analysis using Hana // // base dimensions M L T I K J N using mass = decltype(hana::tuple_c); using length = decltype(hana::tuple_c); using time_ = decltype(hana::tuple_c); using charge = decltype(hana::tuple_c); using temperature = decltype(hana::tuple_c); using intensity = decltype(hana::tuple_c); using amount = decltype(hana::tuple_c); // composite dimensions using velocity = decltype(hana::tuple_c); // M/T using acceleration = decltype(hana::tuple_c); // M/T^2 using force = decltype(hana::tuple_c); // ML/T^2 template struct quantity { double value_; explicit quantity(double v) : value_(v) { } template explicit quantity(quantity other) : value_(other.value_) { static_assert(Dimensions{} == OtherDimensions{}, "Constructing quantities with incompatible dimensions!"); } explicit operator double() const { return value_; } }; template auto operator*(quantity a, quantity b) { using D = decltype(hana::zip_with(std::plus<>{}, D1{}, D2{})); return quantity{static_cast(a) * static_cast(b)}; } template auto operator/(quantity a, quantity b) { using D = decltype(hana::zip_with(std::minus<>{}, D1{}, D2{})); return quantity{static_cast(a) / static_cast(b)}; } int main() { quantity m{10.3}; quantity d{3.6}; quantity t{2.4}; quantity v{d / t}; quantity a{3.9}; quantity f{m * a}; }