【问题标题】:Passing any enum of a given type as function parameter将给定类型的任何枚举作为函数参数传递
【发布时间】:2026-01-21 19:20:12
【问题描述】:

我正在开发一个使用 Arduino 框架的 AVR 微控制器项目。

我正在构建一个简单的错误跟踪系统,结构为一个类 (ErrorManager)。我已经定义了几个函数,比如

void ErrorManager::error(??? errorCode) { // more on ??? later
    // rise error in some way
}

我想在组成这个项目的不同模块中分别定义错误代码。在每个模块中,我想定义一个包含该模块代码的enum class,然后将它们传递给上面的error 函数:

namespace someNamespace /* or class SomeClass */ {

// cointains error codes for this class/module/part of the code
enum class ErrorCodes : unsigned int { 
    none = 0,
    anError,
    someOtherError
}

void foo() {
    error(ErrorCodes::anError);
}

}

(让errManager 成为我项目的一个模块中声明的ErrorManager 对象)

我可以通过在??? 中写入unsigned int 并使用enum 而不是enum class 来完成此操作,但这意味着错误代码名称将在整个模块命名空间的范围内,或者在至少,在定义它们的整个类中,我宁愿避免这种情况。

有没有办法用enum class 做到这一点?例如,要在??? 中写一些内容,意思是“将任何 Enum(带有 unsigned int,或一些 typedefined 类型,甚至任何整数类型)作为参数”?

【问题讨论】:

  • 为什么不void ErrorManager::error(ErrorCodes errorCode)
  • @Juraj 因为不知道 ErrorCodes 何时定义 error,抱歉我没有说清楚。我正在更新问题。
  • 然后使用命名空间而不是枚举。或包装在命名空间中的匿名枚举
  • 谢谢,我没有想到后一种可能性!!但是,出于兴趣,是否可以以任何方式定义一个将任何enum class 作为参数的函数?像enums 的某种继承机制? (我相信不存在真正的继承,对吗?)

标签: c++ arduino microcontroller


【解决方案1】:

看来你需要一个模板:

template <typename T>   
void /*ErrorManager::*/error(T x) 
{ 
    unsigned int errorcode = (unsigned int)x;
    // Do something with it
} 

enum class ErrorCodes : unsigned int {
    none = 0,
    anError,
    someOtherError
};

void foo() {
    error<ErrorCodes>(ErrorCodes::anError);
}

应该可以使用enable_ifis_enum 将模板限制为枚举,但我目前无法编译它。似乎 Arduino 缺少标准库。

请注意enum 的默认基础类型是int,而不是unsigned int

【讨论】:

  • 感谢您的回答!但是我还有一个问题:如果我使用模板,如何确保我永远不会用无法转换为unsigned int 的东西调用error
  • 使用模板类,您将获得每个错误代码类的不同实现。这增加了代码大小。但是,这可能不是问题。
  • 如果 T 无法转换为 unsigned int 我会收到编译器诊断消息。