【发布时间】:2020-06-06 23:26:30
【问题描述】:
我编写了一对转换器函数,用于在以弧度表示的角度的浮点表示和二进制角度(又名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_binangletrait 并不能防止使用无符号整数代替新类型。 我知道,我可以将这些新类型定义为结构,它会解决这个问题,但我有理由不将它们声明为 class 或 struct(to避免重新定义算术运算符并保持与旧的 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 ,否则这是不可能的。对吗?
【问题讨论】:
-
typedefs 意味着你的 binangs 只是无符号整数类型的同义词。您无法保护“新类型”,因为没有任何新类型。
binang8_t只是是uint8_t。你的意思是你想强迫用户在使用你的代码时调用uint8_tbinang8_t? -
biang16_t和uint16_t是同一个类型但名称不同。如果这是您的问题,您无法在模板上下文中区分它们...? -
Allan Cameron 我想防止用户混合使用
uin8_t和binang8_t。我想要以binang8_t作为参数的函数拒绝接受`uin8_t`。我想我必须放弃并使用新的班级和明确的演员表。我希望typedef不仅仅是“类型别名”。 -
不,它只是一个类型别名。在您的场景中,您不会阻止用户混合 uin8_t 和 binang8_t,因为没有什么可以混合 - 只是相同的类型。
标签: c++ casting operators typedef