2015-09-18 1 views
-1

Можно ли перегрузить макросы, которые могут выполнять разные операторы (=, + =, - =, ++, - и т. Д.) С тем же именем макроса?Перегрузка макросов с помощью разных подписи

Я хотел бы, чтобы добиться чего-то вроде этого:

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

Что такое 'LOG_STAT ("hello") + = 10; 'должен означать? Особенно с 'LOG_STAT (...)' является 'std :: ostream' .. –

+1

Макросы являются злыми. Создайте класс, который перегружает эти операторы, чтобы делать то, что вы хотите, если нужно. –

+0

@BillLynch - еще один пример перегрузки. Например, значение + = увеличило бы число в классе stat. В приведенном выше примере значение будет равно 15 при вызове деструктором. – Adam

ответ

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)

Смежные вопросы