Я пишу макрос, который принимает объявление в качестве единственного аргумента. Можно ли определить тип объявления внутри макроса, не разделяя один аргумент на отдельные аргументы type и identifier?
#define M(declaration) \
declaration; \
static_assert(sizeof(/* deduce type of 'declaration' */) == 4, "!")
M(int i);
M(double d{3.14});
M(std::string s{"Hello, world!"});
Следующая реализация будет работать, но она менее удобна для пользователя (imo):
#define M(type, identifier) \
type identifier; \
static_assert(sizeof(type) == 4, "!")
M(int, i);
M(double, d{3.14});
M(std::string, s{"Hello, world!"});
Если возможно, я бы предпочел принять декларацию в качестве одного аргумента.
Связанный вопрос: Макрос для получения типа выражение; но мне не удалось заставить этот код работать в моем примере (ошибка компилятора: ожидаемый спецификатор вложенного имени).