【问题标题】:How to handle different datatype options when compiling?编译时如何处理不同的数据类型选项?
【发布时间】:2011-12-21 00:41:44
【问题描述】:

我应该如何在我的代码中处理多种数据类型的可能性?

我希望可以使用 double 或 float 类型进行编译,这是我目前使用的代码:

#define USE_FLOAT_PRECISION

...

#ifdef USE_FLOAT_PRECISION
    typedef float DATATYPE;
    #define GL_DATATYPE GL_FLOAT
#else
    typedef double DATATYPE;
    #define GL_DATATYPE GL_DOUBLE
#endif

...

DATATYPE somevar;
...
for(...){
    for(...){
        ...
        somevar *= (DATATYPE)1.02; // is this good?
        ...
    }
}

...

glVertexPointer(3, GL_DATATYPE, ... // can this be done better?

...

这很好用,但我觉得在我使用它的每个地方都使用 (DATATYPE) 进行强制转换有些不好,而且看起来也很丑,为每个地方粘贴它会很烦人。还有其他解决方案吗?

编辑: 我担心转换为(DATATYPE) 的原因是因为我需要在我的代码中以双精度表示浮点值,但稍后将其转换为 (float),所以恐怕从 double 转换为 float 会导致一些问题。我也不确定它是否有效,我听说 static_cast 更快或什么的。但我不确定我为什么要使用它,我应该在这里使用它。

【问题讨论】:

  • 这和我过去看到的差不多。唯一的区别是使用函数样式的宏进行访问:DATATYPE_CREATE(0.5)。这使您不仅可以为浮点类型实现强制转换。例如。它可以是一个没有硬件浮点的平台上的类。
  • 听起来像是模板的工作,不是吗?
  • 编译器应该在编译时将常量转换为浮点数。此外,您可能需要额外的宏来处理 sprintf 类型的东西,以区分 %f 和 %Lf
  • @Hybrid, %f 适用于双精度和浮点数,到目前为止没有问题。
  • 你能给我们展示一个在内部使用双精度的 OpenGL 实现吗?

标签: c++ windows visual-c++ opengl


【解决方案1】:

不要将此代码粘贴到任何地方,而应考虑将其放在标题中,您可以将其包含在您需要的地方。

您的上述方法将起作用,并且是实现您想要的几种方法之一。

其他方法可能涉及使用可以稍微简化代码并提供更大灵活性的模板。

【讨论】:

  • 标题是什么意思?那个宏?当然。这不是我所说的“到处粘贴这段代码”的意思,我的意思是“(DATATYPE)”在我使用的每个可能的浮点值之前。我之所以担心这个是因为我需要用double类型来表示float,然后再将它转换为float。
【解决方案2】:

C++11 有用户定义的文字,可用于简化转换:

DATATYPE operator "" _dt(long double x) {
  return x;
}

somevar *= 1.02_dt;

【讨论】:

  • niiiice,太糟糕了,我的编译器不支持它:/我也不确定它的效率如何,每次我在代码中使用 1.02_dt 时它是否像函数调用一样工作?还阅读我的编辑, static_cast 怎么样?这样更好吗?
  • @Rookie 它将被内联而没有开销 - 与 (DATATYPE)static_cast<DATATYPE> 相同。 static_cast 只是 C 风格转换的更具体版本 - 性能相同,但更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2019-12-02
  • 1970-01-01
  • 2019-05-04
  • 2017-06-04
  • 2020-12-18
  • 2017-09-25
相关资源
最近更新 更多