C++ 定制&x27;编号';类别—;它能代替';浮动';还是其他内置类型?
我正在编写一个包含各种操作符重载的类,它应该是某些“外部”代码中的C++ 定制&x27;编号';类别—;它能代替';浮动';还是其他内置类型?,c++,lua,c++14,C++,Lua,C++14,我正在编写一个包含各种操作符重载的类,它应该是某些“外部”代码中的float(或类似)的替代品。 特别是,我想支持3个示例用法(见下文),但我找不到一种方法来定义我的类,以满足所有3种用法 可能吗 旁白:事实上,我正在尝试在Lua5.3中实现一个自定义的lua_Number类型,它通常是float或double。我将Lua编译为C++,并尝试使用定点表示。虽然我确实可以修改“外部”代码(因为它只是嵌入了Lua),但我还是不愿意(: 实时代码链接,如果您想玩: 以下是我需要支持的3个用例: 示例1
float
(或类似)的替代品。
特别是,我想支持3个示例用法(见下文),但我找不到一种方法来定义我的类,以满足所有3种用法
可能吗
旁白:事实上,我正在尝试在Lua5.3中实现一个自定义的lua_Number
类型,它通常是float
或double
。我将Lua编译为C++,并尝试使用定点表示。虽然我确实可以修改“外部”代码(因为它只是嵌入了Lua),但我还是不愿意(:
实时代码链接,如果您想玩:
以下是我需要支持的3个用例:
示例1:MyNum是工会成员的简单用法。
这意味着我不能有异国情调的复制构造函数之类的,因为这些构造函数的“非平凡”版本会导致联合的格式不正确(没有修改)
示例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
的用法。这需要自定义运算符=
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和示例2将编译,但示例3不会编译
如果我包括操作符=
的volatile
版本,那么示例1和示例3将编译,但示例2不编译
有没有办法让它们都工作
或者,如果做不到这一点,有没有对外部代码进行“微创”更改以使其工作的想法?也许最简单的方法是将互操作性所需的联合定义为:
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);
}
};
此联合非常适合任何低级操作,如
volatile
,因为它只涉及基本类型;另一方面,使用getter和setter方法,可以很容易地使用num
字段作为MyNum
对象的存储。可以帮助实现?@πάνταῥεῖ: 我不理解你的评论-也许这是为了一个不同的问题?“我正试图在Lua5.3中实现一个自定义的lua\u编号
type”这是行不通的。lua_Number
必须是内置类型。lua代码库不能处理任何用户定义的内容,因为C不是这样工作的。@jwd不,这是为了这个。你说你想实现精确分数而不是FP intrinsic,对吧?@nicolas为什么一定要这样做?例如,PICO-8使用的是一个定点实现Lua解释器中的数字。这是一个开源克隆。它是Lua5.2;我正试图在5.3中做类似的事情。
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(const MyNum& other) = default;
MyNum& operator=(const MyNum& other) = default;