C++ "Floating Point Enum"
C++ "Floating Point Enum"
我正在寻找使用 C++03 标准的解决方案(我不得不使用这个版本的标准好几年)。C++11的解决方案也是受欢迎的,但不会被"接受"为这个问题的答案。
我可以将一组相关的常量浮点值表示为单个类型(类似于枚举),以确保类型安全而不会产生大量开销,并且仍然允许我直接将值作为浮点数进行操作,这是一种简单、简洁的方法?
最终结果是我希望能够执行以下操作:
enum FloatingPointEnum
{
VALUE1 = 0.1234f,
...
VALUEN = 0.6789f
};
float SomeFunction(FloatingPointEnum value)
{
float new_value;
/* perform some operation using "value" to calculate "new_value" */
new_value = static_cast<float>(value); // <- a simplistic example
return new_value;
}
虽然我可以想到几种解决方案,但没有一个像我想要的那样干净/简单/直接,我认为一定有人已经对这个问题有一个优雅的解决方案(但我似乎在我的搜索中找不到一个)。
编辑:
我希望以下对 SomeFunction 的调用,其值未直接指定为枚举类型的值,无法编译:
float nonEnumeratedValue = 5.0f
SomeFunction(nonEnumeratedValue);
一定有人已经有一个优雅的解决这个问题的方法
有很多问题没有优雅的解决方案(许多问题根本没有解决方案)。是什么让你认为这个问题有一个? 您可以获得的最接近的是使用包装类。
class FloatingPointEnum {
float f;
FloatingPointEnum(float arg) : f(arg) {}
public:
static const FloatingPointEnum Value1;
static const FloatingPointEnum Value2;
operator float() const { return f; }
};
const FloatingPointEnum FloatingPointEnum::Value1(0.1234f);
const FloatingPointEnum FloatingPointEnum::Value2(0.6789f);
一种可能的替代解决方案,并不总是适用但非常干净,是使用固定精度。
假设您有一个包含一些以米为单位的距离的枚举
enum DistancesMeter{
A = 0.25,
b = 0.05,
};
然后你可以简单地切换到使用MM
enum DistancesMM{
A = 250,
b = 50,
};
在 C++11 中,您可以使用constexpr
来实现您想要的。
constexpr
- 指定变量或函数的值可以出现在常量表达式中http://en.cppreference.com/w/cpp/language/constexpr
使用 constexpr
可以定义编译时常量。 这仅适用于文本类型,例如 float
。 因为同时我们想要
float nonEnumeratedValue = 5.0f;
SomeFunction(nonEnumeratedValue);
要失败,我们不能使用简单的typedef
. 相反,我们使用 Boost 的 BOOST_STRONG_TYPEDEF
.
#include <boost/serialization/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(float, FloatingPointEnum);
constexpr float VALUE1 = 0.1234f;
constexpr float VALUEN = 0.6789f;
float SomeFunction(FloatingPointEnum value)
{
float new_value;
/* perform some operation using "value" to calculate "new_value" */
new_value = static_cast<float>(value); // <- a simplistic example
return new_value;
}
现在,您只能使用 FloatingPointEnum
的实例调用该函数。 不幸的是,实例化语法不再那么好
FloatingPointEnum f {VALUEN};
或者,您可以简单地使用 D 编程语言,其中支持浮点枚举,并且以下代码按预期工作:
enum FloatingPointEnum
{
VALUE1 = 0.1234f,
//...
VALUEN = 0.6789f
};
float SomeFunction(FloatingPointEnum value)
{
float new_value;
new_value = value; // No cast needed, welcome to D!
return new_value;
}
使用float
调用SomeFunction
会导致
Error: function test.SomeFunction (FloatingPointEnum value) is not callable using argument types (float)
- enum是C++中的宏变量还是整数变量
- 是否可以从int转换为enum类类型
- 在一个模板函数中,若输入的类型是enum类,我该如何使用std::underlying_type
- 在C++中,将int值赋给enum,反之亦然
- 两个 COM 组件中 ENUM 的重复条目
- 类继承,ENUM 与 AST 类实现的问题
- C++关于ENUM的问题。我得到的响应比枚举列表大
- Qt5 部署"procedure entry point could not be located"
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- sizeof(enum) 可以不同于 sizeof(std::underlying_type<Enum>::
- 如何从内存中分配GDI+ POINT类地址?
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 如何将set和enum一起使用
- 如何限制从int到enum类的转换
- 编译为 cuda 内核调用提供了"expression must have integral or unscoped enum type"
- 如何在OpenCV中存储部分轮廓点喜欢新矢量中的左侧,该类型为<vector<vector<Point>>
- 在每个向量<向量中查找最小/最大 x,y<Point>>
- "Entry Point Not Found" Azure 中的错误 LightGBM R 包
- Access C++ Enum from Swift
- C++ "Floating Point Enum"