Макрос C/C++, расширяющий аргумент, аргумент как строка

У меня много переменных, которые называются так же, как элементы в документе инженерной спецификации, поэтому строковая версия имени также полезна.

Я часто использую макрос вроде этого:

#define MACRO(a) a, #a

Типичное использование:

void someFunction(int a, const char *name);

someFunction(MACRO(meaningfully_named_variable));

Мой вопрос состоит из трех частей:

  • Есть ли лучший способ сделать это?
  • Есть ли подобный макрос в Boost или других библиотеках?
  • Если нет, то как я могу доработать и переименовать его, чтобы он стал понятным и полезным?

Edit Я должен был сказать, что приведенный выше пример является минимальным. У функции могут быть другие параметры, а именованная сущность может быть членом данных или, возможно, даже самой функцией.

Еще одно расширение, которое я рассматриваю для C++, это класс NamedRef, который мог бы получать содержимое макроса.

template <typename T>
struct NamedRef
{
    NamedRef(T *t, const char *name) : t(t), name(name) { }
    T *t;
    const char *name;
};

template <typename T>
NamedRef<T> namedRef(T &t, const char *name)
{
    return NamedRef<T>(&t, name);
}

#define WITH_NAME(a) a, #a

// more sophisticated usage example
void otherFunction(double, NamedRef<int>, bool);

otherFunction(0.0, namedRef(object.WITH_NAME(meaningful_member_name)), false);
8
задан Brian Tompsett - 汤莱恩 4 April 2016 в 11:35
поделиться