如何使用类枚举的值:char作为函数的char参数



为了编写更干净的代码,我(可能过度(使用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)'

我的目标是:

  1. 为了便于代码完成,建议使用这些硬编码常数值
  2. 能够重用相同的名称,但在自己的枚举中保持干净的名称空间
  3. 为了让程序员可以轻松地选择一个代码并将其传递给函数,而不必太费脑筋

如果枚举不能在这里买单,有什么好方法?创建一个带有一些静态常量的类?(这可能是我在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)

最新更新