Здравствуйте, Кодт, Вы писали:
К>Да, решение с traits — симпатичное. Единственное пожелание — чтобы не писать множитель для каждого типа, а выводить их из базисных.
К>К>template<int M, int L, int T, int Q // размерность: масса,длина,время,заряд
К> class S1, class S2 // тэги систем
>>
К>struct unit_traits
К>{
К> static double scale()
К> { static s = pow(unit_traits<1,0,0,0,S1,S2>::scale(),M)
К> * pow(unit_traits<0,1,0,0,S1,S2>::scale(),L)
К> * pow(unit_traits<0,0,1,0,S1,S2>::scale(),T)
К> * pow(unit_traits<0,0,0,2,S2,S3>::scale(),Q);
К> return s;
К> }
К>};
К>// и соответствующие специализации для ортов
К>
1. У меня они как раз и выводятся из базисных. Или я неверно понял?
2. Здесь, насколько я понимаю, вычисление производится в run-time. У меня в первом варианте — в compile-time. Хотя, наверное, можно ввести метафункцию pow...
Надо подумать. Причина введения числителя и знаменателя отдельно была в том, что нельзя использовать статические константы типа double. Но конечно, если как следует подумать, наверняка можно что-нибудь соорудить...
К>Кстати, для внесистемных единиц (наподобие температуры в кельвинах или мощности в лошадиных силах) придётся тоже что-то придумывать.
Ну, в данном случае это не проблема. Вводим еще одну систему единиц (например, SystemExt) и дело в шляпе!
... << RSDN@Home 1.1.4 beta 7 rev. 447>>