是否可以重载可以使用相同宏名称执行不同运算符(=,+ =, - =,++, - 等)的宏?
我想实现这样的目标:
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;
};
答案 0 :(得分:1)
为您的班级创建运算符:
Stat& Stat::operator += (int rhs)
{
number += rhs;
return *this;
}
Stat operator + (const Stat& lhs, int rhs)
{
Stat res(lhs);
res += rhs;
return res;
}
template <typename T>
Stat& operator << (Stat& stat, const T&value)
{
stat.stream << value;
return stat;
}
然后你可以直接使用
Stat("hello") << "world";
Stat("hello") = 5;
Stat("hello") += 10;
(您仍然可以将您的MACRO用于#define LOG_STAT Stat
)