为了编写更干净的代码,我(可能过度(使用enums
,如下所示:
enum class SoundFileCode : char {
PC_STARTUP = '1', // probably never used
LOADING_READY = '2',
VOICE_RECOGNITION_ON = '3',
VOICE_RECOGNITION_OFF = '4',
DISPENSING = '5'
};
我希望能够以一种非常干净的方式将该值传递给一个函数(最好不必强制转换任何东西来使其成为一个更干净的API(:
sendRemoteAudioMessage(SoundFileCode::LOADING_READY);
这是函数签名:void sendRemoteAudioMessage(char audioCode){ }
我看到你在摇头。你已经知道我将要得到的错误:Compilation error: cannot convert 'SoundFileCode' to 'char' for argument '1' to 'void sendRemoteAudioMessage(char)'
我的目标是:
- 为了便于代码完成,建议使用这些硬编码常数值
- 能够重用相同的名称,但在自己的枚举中保持干净的名称空间
- 为了让程序员可以轻松地选择一个代码并将其传递给函数,而不必太费脑筋
如果枚举不能在这里买单,有什么好方法?创建一个带有一些静态常量的类?(这可能是我在PHP/Java中处理它的方式(
更新
以下方法(虽然有些冗长(编译并运行良好。有更好的方法吗?
class SoundFileCode {
public :
static const char PC_STARTUP = '1';
static const char LOADING_READY = '2';
static const char VOICE_RECOGNITION_ON = '3';
static const char VOICE_RECOGNITION_OFF = '4';
static const char DISPENSING = '5';
};
enum class
故意不允许对底层类型进行隐式强制转换,因此您要么需要static_cast<>
,要么最好在被调用者中使用枚举。
如果以上两种方法都不起作用,例如,因为您调用的函数在库中,您仍然可以执行将enum
包装成namespace
(或class
(的老把戏:
namespace SoundFileCode {
enum type : char {
PC_STARTUP = '1',
// ...
}
}
在这种情况下,枚举值的名称仍然为SoundFileCode::PC_STARTUP
,但可以隐式转换为char
。一个不便之处在于,现在您需要在枚举的声明(以及使用该类型的其他地方(中使用SoundFileCode::type
:
int main() {
SoundFileCode::type sfc = SoundFileCode::PC_STARTUP;
sendRemoteAudioMessage(sfc);
sendRemoteAudioMessage(SoundFileCode::PC_STARTUP);
}
如何使用类枚举的值:char作为函数的char参数?
枚举类可以使用static_cast
:转换为整数
sendRemoteAudioMessage(static_cast<char>(SoundFileCode::LOADING_READY));
(最好不必铸造任何东西,使其成为更清洁的API(:
清洁API的理想解决方案是使用匹配的参数类型:
void sendRemoteAudioMessage(SoundFileCode audioCode)