У меня есть много переменных, имена которых совпадают с элементами в документе технической спецификации, поэтому строковая версия имени также полезна.
Я часто использую такой макрос:
#define MACRO(a) a, #a
Типичное использование:
void someFunction(int a, const char *name);
someFunction(MACRO(meaningfully_named_variable));
Мой вопрос тройной:
- Есть ли лучший способ сделать это?
- Имеется ли подобный макрос в Boost или других библиотеках?
- Если нет, как я могу уточнить и переименовать это, чтобы сделать его понятным и полезным?
Редактировать
Я должен был сказать, что вышеизложенное является минимальным примером. Функция может иметь другие параметры, а именованная сущность может быть элементом данных или, возможно, даже самой функцией.
Еще одним расширением, которое я рассматриваю для 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);