반응형

전체 글 237

boost asio io_service(io_context)의 이해 및 활용

boost asio에서 io_service(io_context)는 객체의 이벤트 처리를 담당합니다. 이 객체는 좀 더 자세히 보면 실제적으로 socket과 바인드 되어 socket의 이벤트 처리를 담당합니다. 이 객체는 OS kqueue, /dev/poo/, epoll, iocp와 같은 비동기 socket IO나 select와 같은 동기 IO를 해당 객체를 호출한 쓰레드에서 이벤트를 처리하도록 직렬화합니다. 이를 활용하는 방법을 살펴보겠습니다. io_service(io_context)는 socket에 바인드 되는 관계로 socket 이벤트 처리 그룹을 만들 수 있습니다. io_service1(io_context)에는 socket1, socket2를 바인드하고 io_service2(io_context)에는..

C++ optional의 활용

C++ 17에 추가된 유용한 클래스 중에 optional이 있습니다. 해당 객체는 값을 리턴할 때 값이 없음을 표현하기에 유용합니다. 예제로 optional의 활용을 살펴보기로 하겠습니다. 참고로 optional을 사용하기 위해서는, 즉 아래 예제 코드를 컴파일 하기 위해서는 컴파일러에서 C++ 17 표준을 지원해야 하며 Visual Studio 컴파일러 같은 경우 C++ 17을 지원하기 위한 컴파일 옵션을 설정하여 주어야 합니다. #include #include #include using namespace std; class test_optional { private: vector data_{ 10, 20, 30 }; public: int getByIndex1(int index) { if (index ..

C++ 프로그래밍 2021.10.24

Unity 정적(Static)객체를 전역 변수처럼 활용하기

개인적으로 사용하는 정적 클래스의 예는 아래와 같습니다. public static class Global { public static bool IsDev { get { #if DEV return true; #else return false; #endif } } public static NextStageMode ModeForNextStage { get; set; } public static int Stage { get; private set; } = 1; public static bool IsBossStage { get { return (Stage % 10 == 0); } } } 이 객체는 예로 유니티 어느 곳에서나 Global.IsDev와 같이 사용할 수 있습니다. 정적 객체는 씬과 함께 로드되고 삭제되..

Unity 싱글톤(Singleton)의 이해

Unity에서의 싱글톤은 일반적인 C#에서의 코드와는 다르며 일반적인 코드는 아래와 같습니다. public class Settings : MonoBehaviour { private static Settings inst_ = null; public static Settings Inst { get { return inst_; } } private void Awake() { if (inst_ == null) { inst_ = this; DontDestroyOnLoad(gameObject); } else { if (inst_ != this) { Destroy(gameObject); } } } } 위의 코드에서 보면 알 수 있듯이 처음 인스턴스를 만들 때는 gameObject에 대해서 DontDestroyOnLo..

C++ boost json용 라이브러리(boost.json)

boost 1.75 이전 버전은 json을 사용하기 위하여 property_tree를 사용하였습니다. 1.75 버전부터 json을 전문적으로 지원하는 boost.json라이브러리가 생겼습니다. boost.json을 사용하는 Hello World입니다. #include #include #include using namespace boost; using namespace std; int main(int argc, char* argv[]) { json::value jv = { { "Hello", "World" } }; std::string str = json::serialize(jv); cout

C++ boost property_tree를 이용한 간단한 xml 파싱 예제

C/C++에서 json을 사용하려고 boost property_tree를 사용하다가 이 클래스가 xml파싱에도 거의 동일한 인터페이스로 사용할 수 있다는 것을 알게 되었습니다. 아래 예는 간단한 boost property_tree를 이용한 xml 파싱 예입니다. 참고로 소스 중 read_xml에서 iss(istringstream) 대신에 문자열을 넣으면 파일에서 읽게 됩니다. #include #include #include #include #include using namespace std; using namespace boost::property_tree; int main(int argc, char* argv[]) { string data = "" "" "Hello" "" "1" "2" "3" "" "..

C++ boost json(property_tree) Hello World

boost의 property_tree를 이용한 json Hello World입니다. boost 버전 1.75부터 json을 정식 지원하는 것 같은데 인터넷에 많이 있는대로 property_tree를 이용하여 json을 다룬다면 가장 기본이 되는 코드입니다. #define BOOST_BIND_GLOBAL_PLACEHOLDERS #include #include #include #include using namespace std; using boost::property_tree::ptree; int main(int argc, char* argv[]) { ptree root; root.add_child("Hello", ptree("World")); ostringstream oss; write_json(oss, ..

C++에서 stderr로 출력하기

요즘에도 stdout, stderr을 구분해서 출력하는지 모르겠지만 C/C++을 정석적으로 코딩한다면 에러 관련 내용은 stderr로 구분해서 출력하는 것이 좋다. stdout과 stderr로 구분하여 출력하면 Unix(Linux) Shell이나 Dos Shell에서 필터링해서 구분해 볼 수 있다. C 라면 아래와 같이 구분해서 출력할 수 있다. 물론 stdout을 사용한 부분은 그냥 printf을 사용해도 동일하다. fprintf(stdout, "test0\n"); fprintf(stderr, "test1\n"); C++ 이라면 아래와 같이 구분해서 출력할 수 있다. cout

C++ 프로그래밍 2021.10.11

C++ wstring용 가변인자 포맷(format) 스트링 만들기

C/C++로 로그(log) 같은 함수를 만들거나 변수들을 문자열로 만들고 싶을 때가 있다. 이런 때 쉽게 사용할 수 있는 함수이다. 여기서는 기본이 되는 함수의 소스를 소개할까 한다. 아래 함수는 wstring을 string으로 wchar_t을 char로 _vsnwprintf_s을 char용으로 수정하면 string용으로 수정할 수도 있다. _vsnwprintf_s은 윈도우용 API인 관계로 Linux 혹은 Unix에서는 해당 OS에 맞는 함수로 수정하면 Linux나 Unix에서 사용할 수 있다. 여기서는 소스가 복잡해지는 관계로 string용이나 윈도우 외의 OS용으로는 만들지 않았다. 또한 다른 가변 인자 함수에서의 사용을 위하여 주요 로직을 가지고 있는 함수의 인자는 va_list로 처리하였다. s..

C++ 프로그래밍 2021.10.08

[MongoDB] 윈도우용 MongoDB C/C++ Driver 컴파일 및 인스톨 하기

MongoDB를 C/C++에서 사용하기 위해서는 C용 MongoDB C Driver와 C++용 MongoDB C++ Driver가 있어야 한다. MongoDB C와 C++ Driver는 MongoDB를 사용하기 위한 일종의 라이브러리라고 볼 수 있다. 근데 이 드라이버가 윈도우에서는 MSI나 ZIP파일 형태로 제공되지 않아 소스를 받아서 컴파일 해야 한다. 또한 해당 드라이버는 현재 시점에서 64bit만 지원한다. 여기서는 Visual Studio 이용하여 드라이버를 컴파일 하는 방법을 살펴보기로 하겠다. 1. 윈도우용 CMake를 미리 다운받아 인스톨하여 놓는다. 참고로 인스톨 전에 기존 버전이 있으면 언인스톨해야 하며 64bit 버전을 인스톨한다. 이때 인스톨된 CMake는 PATH상에 존재하여 어디..

DirectX 관련 참고할 만한 역사

운영하던 3D 관련 블로그 폐쇄하면서 가져온 글인데 아직도 유용한 것 같아 들리시는 분들 읽으라고 공개로 남겨놓습니다. 이틀간 각종 3D API와 H/W에 대하여 아무 생각없이 아래와 같이 wikipedia에서 찾아보았다. 이런저런 잡지식인데 참이나 재미있었다. DirectX DirectX에 대한 역사로 윈도우95부터 시작하여 DOS개발자를 끌어들이기 위한 한 방법으로 시작되었다는 사실이 흥미롭다. 또한 처음에는 WinG와 같이 사장될 것을 두려워해 개발자들이 배우기를 꺼려했다는 사실은 ATL, ASP, MFC, OLE 등등 사장되었거나 사장되어가는 MS기술을 지켜본 나에게 많은 공감을 준다. DirectDraw DirectDraw에 대한 이야기로 7부터 비추되어서 8에서 부터는 제거되었다. Direct..

CComVariant(tagVARIANT)을 wstring 혹은 CString으로 변환하기

CComVariant(tagVARIANT)는 모든 타입을 다 넣을 수 있는 union 구조체라서 해당 내용을 디버깅해 보기가 까다롭다. 여기서는 간단히 값을 볼 수 있게 wstring이나 CString으로 변환하게 해놓았다. CComVariant(tagVARIANT)는 vt라는 필드를 가지고 있다. 해당 필드는 객체가 어떤 타입의 값을 가지고 있는지 enum 타입으로 가지고 있다. 아래 코드는 해당 필드를 이용하여 CComVariant(tagVARIANT) 값을 wstring으로 변환하는 코드다. 윈도우에서 짜는 관계로 편의상 CString의 Format을 이용하였다. 고로 함수의 return 타입을 CString으로 변경하고 조금만 수정하면 CString으로도 변경된다. 참고로 아래 코드는 모든 타입을..

반응형