Я знаю, что я буду наказан за это, но я бы хотел сделать что-то вроде этого:
#define DEF_CLASS(x) \
#define CLASS x \
#define CONSTRUCTOR CLASS::CLASS \
#define COPY_CONSTRUCTOR(x) CONSTRUCTOR(const CLASS& x)
То есть я хотел бы иметь функцию «#define», которая динамически определяет другие «#defines».
У меня есть IDE, которая не способна к рефакторингу, кроме того, я бы хотел, чтобы конструкторы, особенно конструктор копирования, выделялись из-за его особой роли.
Поэтому я стремлюсь запрограммировать свои определения класса C ++ следующим образом:
CONSTRUCTOR(int i):i(i){}
COPY_CONSTRUCTOR(other):i(other.i){}
void CLASS::fun1()
{
//...
}
Для этого в настоящее время мне нужно скопировать&вставьте три #define строки. Я бы предпочел сделать это автоматически. Есть ли способ осуществить это с помощью препроцессора?
Нет, такая DEF_CLASS(x)
макрос не возможен. Макросы не с состоянием. Лучшее, что вы можете сделать, это:
#define CONSTRUCTOR CLASS::CLASS
#define COPY_CONSTRUCTOR(x) CONSTRUCTOR(const CLASS& x)
...
#define CLASS X
CONSTRUCTOR(int i):i(i){}
COPY_CONSTRUCTOR(other):i(other.i){}
void CLASS::fun1()
{
//...
}
#undef CLASS
#define CLASS Y
CONSTRUCTOR(int i):i(i){}
COPY_CONSTRUCTOR(other):i(other.i){}
void CLASS::fun1()
{
//...
}
#undef CLASS
Но я сильно призываю вас не злоупотреблять таким препроцессором. Зачем запутывать нормальный синтаксис C ++ с этими макросами? Принять C ++ за то, что он есть; не пытайтесь сделать это на другом, более дружественном языке.
Нет — §16.3.4 / 3:
Результирующая полностью заменяемая макросом последовательность токенов предварительной обработки не обрабатывается как директива предварительной обработки, даже если она похожа на одну […]