如何解决自定义“数字”类-是否可以代替“浮动”类或其他内置类型使用?
我正在编写一个带有各种运算符重载的类,该类应以某些“外部”代码替代float
(或类似名称)。
特别是,我想支持3种示例用法(见下文),而且我找不到一种能够满足所有3种要求的类定义方法。
有可能吗?
此外:实际上,我正在尝试在Lua 5.3中实现自定义lua_Number
类型,通常为float
或double
。我正在将Lua编译为C ++,并尝试使用定点表示。虽然确实可以更改“外部”代码(因为它只是嵌入式Lua),但我宁愿不要(:
实时代码链接,如果您想玩转:https://godbolt.org/z/37c6nj
这是我需要支持的3个用例:
示例1:的简单用法,其中MyNum是工会成员。 这意味着我不能使用奇异的复制构造函数,因为这样的“非平凡”版本会导致联合体格式错误(未经修改)。
SomeUnion x;
x.num = 123.0f;
SomeUnion y = x;
示例2::MyNum是联合的成员(如上所述),而该联合是结构的成员。我不确定这与第一个示例有何不同,但这是我当前代码版本的最终症结所在。这是链接的示例中当前未编译的位。
SomeStruct s1;
s1.u.num = x.num;
SomeStruct s2;
// With all the code as-is,this is the line that fails:
// error: use of deleted function 'SomeStruct& SomeStruct::operator=(const SomeStruct&)'
// note: 'SomeStruct& SomeStruct::operator=(const SomeStruct&)' is implicitly deleted because the default definition would be ill-formed
s2 = s1;
示例3:与volatile
有关的用法。这需要自定义operator=
。
volatile SomeUnion v;
// If we don't have a custom operator= with 'volatile' qualifier,we get:
// ERROR: passing 'volatile MyNum' as 'this' argument discards qualifiers [-fpermissive]
v.num = x.num;
如果我删除了volatile
的{{1}}实现,那么Example1和Example2会编译,而Example3不会。
如果我包含operator=
的{{1}}版本,则Example1和Example3会编译,而Example2不会。
有什么办法可以使它们全部正常工作吗?
或者,如果失败,对外部代码进行一系列“微创”更改以使其能够正常工作的想法是什么?
解决方法
也许最简单的方法是将互操作性所需的并集定义为:
union SomeUnion {
uint32_t num;
void * pFoo;
void set(const MyNum& myNum) {
num = *reinterpret_cast<const uint32_t*>(&myNum);
}
MyNum get() {
return *reinterpret_cast<MyNum*>(&this->num);
}
};
MyNum副本应该只是默认设置:
MyNum(const MyNum& other) = default;
MyNum& operator=(const MyNum& other) = default;
该联合非常适合诸如volatile
之类的任何低级操作,因为它只涉及原始类型;另一方面,很容易使用getter和setter方法将num
字段用作MyNum
对象的存储。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。