2013-04-09 2 views
1

Я пытаюсь написать библиотеку журнала, который будет использовать внешний инструментC перечисления # стиля в C++

Я ищу удобный способ добавить ключ-строку в выходном поток, чтобы помочь разбору внешнего инструмента в то время как имеющие наименьшее влияние на программиста, используя библиотеку

цель заключается в достигнутом что-то вроде этого:

cout << DEBUG::VERBOSE << "A should equal 3" << endl; 
cout << DEBUG::WARNING << "something went wrong" << endl; 

сейчас я структурированы мои данные следующим образом

struct Debug 
{ 
static const std::string FATAL_ERROR; 
static const std::string ERROR; 
static const std::string WARNING; 
static const std::string IMPORTANT; 
static const std::string INFORMATION; 
static const std::string VERBOSE; 
static const std::string DEBUG; 
}; 

Это работает найти, но я хотел бы добавить уровень абстракции от std::string.

В Java/C# я мог бы использовать enum для достижения поведения записи, как я могу реализовать это на C++ элегантно.

+0

Избегайте статические переменная не-POD типов (станд :: строка включена). Хотя теперь они могут работать, вы можете столкнуться с кошмаром статической проблемы с инициализацией позже. –

+0

, что было частью цели этого вопроса :) – tiridactil

ответ

5

Я думаю, что в iostreams C++, поток манипуляторы в стиле endl более идиоматические:

#include <iostream> 

namespace debug 
{ 
    std::ostream & info(std::ostream & os) { return os << "Info: "; } 
    std::ostream & warn(std::ostream & os) { return os << "Warning: "; } 
    std::ostream & error(std::ostream & os) { return os << "Error: "; } 
} 

int main() 
{ 
    std::cout << debug::info << "This is main()\n" 
       << debug::error << "Everything is broken\n"; 
} 
Смежные вопросы