[изменить: изменено метров/ярдов до foo/bar; речь идет не о преобразовании счетчиков в ярды. ]предпочтительный механизм для прикрепления типа к скаляру?
Каков наилучший способ привязать тип к скаляру, например double
? Типичный прецедент - это единицы измерения (но я не ищу фактической реализации, boost has one).
Это, казалось бы, простой как:
template <typename T>
struct Double final
{
typedef T type;
double value;
};
namespace tags
{
struct foo final {};
struct bar final {};
}
constexpr double FOOS_TO_BARS_ = 3.141592654;
inline Double<tags::bar> to_bars(const Double<tags::foo>& foos)
{
return Double<tags::bar> { foos.value * FOOS_TO_BARS_ };
}
static void test(double value)
{
using namespace tags;
const Double<foo> value_in_foos{ value };
const Double<bar> value_in_bars = to_bars(value_in_foos);
}
Является ли это на самом деле? Или есть скрытые сложности или другие важные соображения для этого подхода?
Это, казалось бы, далеко превосходит
inline double foos_to_bars(double foos)
{
return foos * FOOS_TO_BARS_;
}
без добавления вряд ли любой сложности или над головой.
Это просто, но вы должны запрограммировать все юридические преобразования вручную. – StoryTeller
Это кажется хорошим примером для [* пользовательских литералов *] (http://en.cppreference.com/w/cpp/language/user_literal). –
А также для std :: ratio – xvan