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;