当前位置: 首页 > 知识库问答 >
问题:

在C11中,如何实现适合内置类型层次结构的算术类型?

周和安
2023-03-14

基本上,我想实现一个flat16类型。但这个问题不是关于如何做到这一点的详细信息,而是如何设置东西,以便我的新flat16类型在浮动、双精度和所有整数类型中表现适当。

我希望我的< code>float16类型能够类似地转换为float或double。例如,它应该隐式转换为这两种类型。它还应该有STD::common _ type(http://en.cppreference.com/w/cpp/types/common_type ),其行为类似于std::common_types对其他浮点类型的行为。这意味着< code>std::common_type

我需要编写哪些构造函数和强制转换运算符才能实现此目的?任何帮助将不胜感激!

我最近的另一个问题可能是相关的。

编辑:好的,我像安东一样做了一个最小的例子。这是

struct float16 {
    explicit operator int() {
        return 0;
    }

    operator float() {
        return 0.0f;
    }
};

这为浮点数和浮点数16提供了正确的通用类型,但 int 和浮点数16 的通用类型仍然是 int。我不明白。

共有3个答案

解飞语
2023-03-14

我将为这个问题提供我自己的答案。

我现在同意6502,我不认为这是一件容易的事。我发现做到这一点的唯一方法是为每一种可能的类型组合提供操作符重载。这可以用稍微好一点的方式用模板来完成(Boost操作符,http://www . Boost . org/doc/libs/1 _ 59 _ 0/libs/utility/operators . htm就是一个很好的例子),但这仍然需要大量的工作和样板代码。

东方涛
2023-03-14

如果将它实现为结构/类类型,请提供所有相关运算符和构造函数的重载。如果一个类支持与其他类型的相互转换,请查阅指南了解该类需要什么。

如果您希望类能够很好地使用标准模板,如<code>std::common_type,则需要提供这些模板的适当专门化。最好阅读实际标准来描述此类专业的要求,但可能有一些教程材料(我已经看到了专业化std::numeric_limits,但不适用于std::common_type的良好介绍材料)。

除非您使用特定于编译器的类型,否则您的类型与内置标准类型(intfloat等)的匹配方式总会有一些限制。

劳研
2023-03-14

我认为你不能完全理解这一点,因为C核心语言对待本机定义的转换(例如chartoint)与用户定义的转换不同(即使它们是隐式的)。

例如之后

struct float16 { float16(int) {} }; // cast int->float16 is implicit

struct Foo { Foo(const double&){} };  // constructor accepts a double&
struct Bar { Bar(const float16&){} }; // constructor accepts a float16&

void foo(const Foo&) {}
void bar(const Bar&) {}

调用<code>foo(3)可以隐式转换为<code>double,并且<code>foo接受一个<code>foo实例,该实例可以通过用户定义的转换(不是<code>显式的<code>的<code>foo构造函数)从<code>double

但是bar(3)无效,因为这样的调用需要两个隐式用户定义的转换(intflat16flat16Bar),这是不允许的。

 类似资料:
  • 我在注释中创建一些元数据结构时遇到了问题。我们使用注释来定义Hibernate实体属性的特殊属性,但它可能在任何地方都可以使用。我想创建表示这些结构的条件: 问题是我需要使用此注释定义一些“树”结构。这是我想达到的一些设计: 我想根据这个例子使用的所有这些注释: 我知道我在上面的注释定义中定义的那种继承是不可能的。但是,我该如何考虑我的注释和,或是在一个“家庭”中?

  • 我有以下Java问题 我有以下通用类,它们可能被描绘为: 其中

  • 这可能是一个非常奇怪的问题,但我甚至不知道如何命名这个问题。我对C#和Selenium很陌生。我已经对它做了一些编码,我很乐意创建一个(quitemessy)测试,它可以按照我想要的方式运行。我想把我的考试安排得更好一点。 我将用这个例子来说明我想要实现的目标: 在登录页面上,我们可以说我有一个“登录”按钮,该按钮打开一个页面,让我输入我的凭证“用户名”和“密码”。 让我们说我想这样编程:有登录的

  • 我正在处理一个需求。当前有一个搜索页面,其中包含值(示例数据)1)Employee和2)Sport Person的列表框。 对象层次结构(Hibernate Bean)Person是实际对象,它具有两个不同的类1)Employee和2)基于Sports Person的鉴别器列 Person_Type(鉴别器列)。 在搜索页面上,如果用户选择任何一个列表框,将从该子类中得到数据。 现在的要求是同时显

  • 查看某个方法在哪个类中定义,在哪些类中实现 操作步骤: 菜单栏: Navigate —> Method Hierarchy 快捷键: Mac: Shift + Command + H Windows\/Linux: Ctrl + Shift + H

  • 问题内容: 我将Play Framework 1.2.4与和一起使用。我想拥有一个模型层次结构,并看到有一些替代方法。 我有一个基类(抽象的)和两个扩展该基类的具体类。我不想坚持这个基础课程,而我想拥有具体的课程。在基类中,我还有另一个Model类作为属性,换句话说,我在基类中有关系。 我的问题是实现此目标的最佳方法是什么?使用或与策略?我有点困惑,因为它们看起来 几乎 相等。 我还担心将来可能会