使用不同签名的宏重载

时间:2015-09-18 03:34:12

标签: c++ gcc macros

是否可以重载可以使用相同宏名称执行不同运算符(=,+ =, - =,++, - 等)的宏?

我想实现这样的目标:

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;
};

1 个答案:

答案 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