Передача любого перечисления данного типа в качестве параметра функции - PullRequest
0 голосов
/ 21 марта 2020

Я работаю над проектом для микроконтроллера AVR с использованием инфраструктуры Arduino.

Я строю простую систему отслеживания ошибок, структурированную как класс (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 объект объявлен в одном модуле моего проекта)

Я мог бы выполнить sh, написав unsigned int в ??? и используя enum вместо enum class, но это означало бы, что имена кодов ошибок будут находиться в области видимости во всем пространстве имен модуля или, по крайней мере, во всем классе, где они определены, и я бы предпочел этого избежать.

Есть ли способ сделать это с помощью enum class? Например, что-то записать в ???, что означает «Принимать любой Enum (с беззнаковым int, или с некоторым типом typedef ined, или даже любым целочисленным типом) в качестве параметра»?

1 Ответ

0 голосов
/ 21 марта 2020

Кажется, вам нужен шаблон:

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_if и is_enum, но я не могу сейчас его скомпилировать. Кажется, для Arduino отсутствуют стандартные библиотеки.

Обратите внимание, что базовый тип enum по умолчанию - int, а не unsigned int.

...