2010-12-15 2 views
0

다음과 같이 보일 수있는 매크로가 있습니다 (부스트 로그 라이브러리에서)벡터에 넣기위한 함수 포인터로 감싸 진 C++ 매크로

#define L_(lvl) BOOST_LOG_USE_LOG_IF_LEVEL(g_l(), g_log_level(), lvl) 

boost :: function <> 오브젝트 또는 함수 포인터로 감싸서 큐 또는 벡터에 고정시킬 수 있습니까? 그런 항목들 중?

그렇다면 어떻게해야합니까?

로그 파일에 모든 로깅을 쓰는 스레드가 하나있는 메커니즘을 작성하려고하는데 작업자 스레드 중 하나라도 로그 할 수 있어야하지만 활성 로그 수준에 따라 달라질 수 있습니다. d 기록 된 내용 만 기록하려고합니다. 그래서 로그 메시지를 대기열에 넣고 전용 스레드를 사용하여 각각의 파일에 기록하는 대기열을 작성하여 로깅이 많이 필요할 때 프로그램을 느리게하지 마십시오. 나는 boost :: log 라이브러리를 사용하여이 매크로로 작업해야한다.

lvl는이 함수에 전달할 로그 수준입니다. 그 사용법은 다음과 같습니다 : L_(debug) << "some log text";

답변

1

, 당신은 함수 내에서 해당 매크로를 호출하고 그 함수에 대한 포인터를 사용할 수 있습니다

void log() { 
    L_(3); 
} 

void anotherlog() { 
    L_(13); 
} 

쉽게 벡터에서 다음 부르는 할 수 있습니다 모두 :

typedef void (*LogFunction)(); 
std::vector<LogFunction> logFunctions; 
logFunctions.push_back(log); 
logFunctions.push_back(anotherLog); 

std::vector<LogFunction>::iterator it, end = logFunctions.end(); 
for (it = logFunctions.begin(); it != end; ++it) 
    (*it)(); 
+0

그리고이 L_ 매크로가 로그 메시지에 대해 사용하는 스트리밍 << 연산자는 어떻게됩니까? 나는 functor를 사용하고 그 operator <<에 과부하를해야합니까? –

0

아니, 당신은 그 근처에 함수 포인터 근처에 매크로를 넣을 수 없습니다. 이와 같은 매크로가 필요 없어도 객체 지향 함수를 사용할 수 있습니다. 로깅 수준의 고정 세트가있는 경우

+0

필자가 사용하고있는 라이브러리의 일부일 수도 있습니다. –

0
void Log(int level) 
{ 
    L_(level); 
} 

typedef boost::function1<void, int> LogFunction; 

std::vector<LogFunction> LogFunctionVector; 

LogFunction L3 = Log(3); 
LogFunction L5 = Log(5); 

LogFunctionVector.push_back(L3); 
LogFunctionVector.push_back(L5); 
1
struct LogFunction 
{ 
    LogFunction(int lvl) :lvl_(lvl) {}  

    TYPE operator()() { return L_(lvl_); } 
    // Where "TYPE" is whatever type L_ returns 
private: 
    int lvl_; 
}; 
1

는 전용 스레드 (WR)의 부스트 구현을 사용할 수없는 이유 이유가 있나요 iter?

typedef logger_format_write< default_, default_, writer::threading::on_dedicated_thread > logger_type; 
관련 문제