Cpp11+에서 std::call_once를 활용한 Singleton logger 구현
Logger를 구현하다가 싱글턴으로 짜고 싶어져서 만든 코드 일부입니다.
이론적인 설명은 제가 하는 것보다 다른 블로그에 잘 설명된 글이 많으니 그 쪽을 참조해주시기 바랍니다.
이 코드에서 8줄부터 싱글턴 구현이 있고 37줄부터는 전역으로 선언된 싱글턴 클래스를 쉽게 쓰기 위해서 Cpp11+에 추가된 기능들을 이것 저것 사용해놨습니다. 최종적으로 55줄처럼 편하게 사용할 수 있는 형태입니다.
이 코드는 성태의 닷넷 이야기 블로그에 올라온 std::call_once를 보고 cpp11+를 보고 꽂혀서 공부하면서 만들기 시작했습니다.
http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=11091&rssMode=1&wtype=0
가변 인자 매크로, Parameter pack 활용
Cpp11+에선 가변 인자 매크로를 통해서 여러 인자를 편하게 매크로로 사용할 수 있습니다.가변 인자 매크로에 관해서는 mycoboco (Jun Woong)님 블로그에 잘 정리되어 있습니다.
http://blog.woong.org/v/59aa5b8cd845cbff6d76d418
Parameter pack은 Cpp11에서 추가된 템플릿 형식입니다.
http://en.cppreference.com/w/cpp/language/parameter_pack
typename... Args로 여러 인자를 편리하게 받을 수 있습니다.
가변 인자 매크로와 함께 사용하면 위 코드와 같이 사용할 수 있습니다.
31줄, 39줄을 쉽게 설명하면 Args&는 입력 받은 매개변수를 call by reference하는 겁니다.
디버그 모드로 찍어서 확인만 해봤지 자세한 동작 원리는 솔직히 잘 모르고 썼습니다.
이론적인 내용은 아래 StackOverFlow에서 읽어볼 수 있습니다.
http://narss.tistory.com/entry/5%EC%9D%BC%EC%B0%A8-%EA%B0%80%EB%B3%80%EC%9D%B8%EC%9E%90-%ED%85%9C%ED%94%8C%EB%A6%BF-variadic-template
위 Gist를 구현할 때 Saba라는 프로젝트를 참조했습니다.
https://github.com/benikabocha/saba/blob/master/src/Saba/Base/Log.h
logger
위 코드의 Log클래스는 전역 싱글턴 객체입니다.
가변 인자 매크로와 템플릿으로 사용하기 편하게 만들어서 55줄처럼 사용합니다.
https://github.com/gabime/spdlog
C++에서 Logger에 대한 종류나 개념은 김연우님 블로그에 잘 설명되어있습니다.
http://ozt88.tistory.com/49
댓글 없음:
댓글 쓰기