Предположим, что у меня есть список #define
в файле заголовка для внешней библиотеки. Эти #define
представляют собой коды ошибок, возвращаемые функциями. Я хочу написать функцию преобразования, которая может принимать в качестве входного кода код ошибки и возвращать в качестве вывода строковый литерал, представляющий фактическое имя #define
.
В качестве примера, если у меня есть
#define NO_ERROR 0
#define ONE_KIND_OF_ERROR 1
#define ANOTHER_KIND_OF_ERROR 2
Я хотел бы, чтобы функция могла вызываться как
int errorCode = doSomeLibraryFunction();
if (errorCode)
writeToLog(convertToString(errorCode));
И пусть convertToString()
сможет автоматически конвертировать этот код ошибки, не будучи гигантским корпусом коммутатора, похожим на
const char* convertToString(int errorCode)
{
switch (errorCode)
{
case NO_ERROR:
return "NO_ERROR";
case ONE_KIND_OF_ERROR:
return "ONE_KIND_OF_ERROR";
...
...
...
У меня такое ощущение, что если это возможно, можно было бы использовать шаблоны и метапрограммирование, но это только работало бы, коды ошибок были фактически типом, а не кучей макросов процессора.