upcastable class template added to provide the base class for upcastable classes

This commit is contained in:
Mateusz Pusz
2019-03-06 18:12:59 -10:00
parent 776c91cf64
commit 310541c9f1
4 changed files with 13 additions and 12 deletions

View File

@@ -29,9 +29,7 @@ or more base dimensions:
```cpp
template<Exponent... Es>
struct dimension {
using base_type = dimension<Es...>;
};
struct dimension : upcastable<dimension<Es...>> {};
```
`units::Dimension` is a Concept that is satisfied by a type that is empty and publicly
@@ -173,8 +171,7 @@ struct merge_dimension {
```cpp
template<Dimension D, Ratio R>
requires (R::num > 0)
struct unit {
using base_type = unit<D, R>;
struct unit : upcastable<unit<D, R>> {
using dimension = D;
using ratio = R;
};
@@ -333,7 +330,7 @@ and
are not arguably much easier to understand thus provide better user experience.
Upcasting capability is provided through dedicated `upcasting_traits` and by `base_type` member
type in `dimension` and `unit` class templates.
type in `upcastable` class template.
```cpp
template<typename T>

View File

@@ -110,6 +110,13 @@ namespace units {
template<Ratio Ratio1, Ratio Ratio2>
using common_ratio_t = typename common_ratio<Ratio1, Ratio2>::type;
// upcastable
template<typename BaseType>
struct upcastable {
using base_type = BaseType;
};
// upcasting_traits
template<typename T>

View File

@@ -71,7 +71,7 @@ namespace units {
struct exp_greater_equal : std::bool_constant<(E1::value >= E2::value)> {
};
// exp_invert
// exp_invert
template<Exponent E>
struct exp_invert;
@@ -87,9 +87,7 @@ namespace units {
// dimension
template<Exponent... Es>
struct dimension {
using base_type = dimension<Es...>;
};
struct dimension : upcastable<dimension<Es...>> {};
// is_dimension
namespace detail {

View File

@@ -29,8 +29,7 @@ namespace units {
template<Dimension D, Ratio R>
requires (R::num > 0)
struct unit {
using base_type = unit<D, R>;
struct unit : upcastable<unit<D, R>> {
using dimension = D;
using ratio = R;
};