Я написал пару функций преобразователя для преобразования между представлением углов с плавающей точкой в радианах и двоичными углами (он же BAMS ):
// Binary angles that maps into 360 degree circle
typedef uint8_t binang8_t;
typedef uint16_t binang16_t;
typedef uint32_t binang32_t;
typedef uint64_t binang64_t;
// Convert from radians to BAMS
template<typename A, typename T> A to_binang(T val);
// Convert from radians or BAMS
template<typename T, typename A> T to_rads(A val);
Основная проблема моя черта is_binangle
, которую я создал для использования внутри конвертеров, не защищает от использования целых чисел без знака вместо новых типов. Я знаю, я могу определить эти новые типы как структуры, и это решит эту проблему , но у меня есть причина не объявлять их как class
или struct
(чтобы избежать переопределения арифметика c операторов и совместимость со старыми C заголовками полезной нагрузки). Есть ли хитрость, чтобы заставить его работать с типами, определенными с помощью typedef
? Вот моя попытка реализовать эту черту:
template<typename T> struct is_binangle {
static const bool value = false;
};
template<> struct is_binangle<binang8_t> {
static const bool value = true;
};
template<> struct is_binangle<binang16_t> {
static const bool value = true;
};
...
В идеале я бы предпочел определить пользовательские приведения для этих типов, чтобы можно было преобразовать просто:
double rangle = M_PI/6;
binang16_t bang = binang16_t(rangle);
bang += bang;
double another_rangle = double(another_bang);
У меня есть Сильное подозрение, что это невозможно, если эти двоичные углы не равны classes
/ structures
. Это правильно?