Можно ли перегрузить макросы, которые могут выполнять разные операторы (=, + =, - =, ++, - и т. Д.) С тем же именем макроса?Перегрузка макросов с помощью разных подписи
Я хотел бы, чтобы добиться чего-то вроде этого:
int main() {
LOG_STAT("hello") << "world";
LOG_STAT("hello") = 5;
LOG_STAT("hello") += 10;
}
Я попытался следующие, и вопрос, который я имею что я не могу переобъявить в LOG_STAT макросъемки, как это уже определено. Пример кода ниже, надеюсь, вы получите эту идею.
#define LOG_STAT(x) Stat(x).streamAdd()
#define LOG_STAT(x) Stat(x).add() // redeclare error here
class Stat {
public:
Stat(const char *type_) : type(type_) {}
~Stat(){ std::cout << type << " " << stream.str().c_str() << " " << number << std::endl;}
int& add() { return number; }
std::ostringstream& streamAdd() { return stream; }
const char * type;
int number;
std::ostringstream stream;
};
Что такое 'LOG_STAT ("hello") + = 10; 'должен означать? Особенно с 'LOG_STAT (...)' является 'std :: ostream' .. –
Макросы являются злыми. Создайте класс, который перегружает эти операторы, чтобы делать то, что вы хотите, если нужно. –
@BillLynch - еще один пример перегрузки. Например, значение + = увеличило бы число в классе stat. В приведенном выше примере значение будет равно 15 при вызове деструктором. – Adam