У нас есть МАКРОС {TT(msg)}, и внутри этого макроса мы вызываем функцию с тем же аргументом, который мы получили в макросе, т.е. 'msg'. функция, которая вызывается из макроса, ожидает строковый аргумент. Теперь предположим, что если макрос вызывается как TT("argument"), то программа компилируется и работает как положено, но если мы будем вызывать макрос как TT("argument"<<i) , то ниже приводится ошибка компиляции.
main.cpp:14:14: ошибка: недопустимые операнды типов ‘const char [4]’ и ‘int’ для двоичного ‘operator<<’
Причина проблемы: когда будет вызываться макрос TT(), он будет напрямую вызывать API func() с параметром, поскольку сообщение имеет некоторые другие значения "XYZ" << i, которые могут не обрабатываться функцией func(). так что как-то нам нужно с этим справиться.
#include <iostream>
using namespace std;
#define TT(msg) func(msg);
void func (string msg) {
cout << msg;
}
int main()
{
int i=9;
TT ("XYZ"<<i);
return 0;
}
Получение этой ошибки: main.cpp:12:62: ошибка: «класс std::basic_ostream» не имеет члена с именем «str»; ты хотел сказать "сетф"? #define TT(msg_expr) func((std::ostringstream{} << msg_expr).str());
Это потому, что версия, на которую я попал, плохо работает с тем, как
operator<<()
обычно перегружается. Я вернул ответ к своей первоначальной, гораздо более уродливой, но, очевидно, лучшей реализации.