프로그래밍/c++
-
boost::variant(std::variant c++17) 사용하기프로그래밍/c++ 2016. 8. 5. 03:38
boost::variant는 n개의 타입이 될 수 있는 타입이다. boost::any와의 차이점은 지정된 형태로만 될 수 있으며 any와는 다르게 타입 변환 시 동적 할당을 사용하지 않기 때문에 퍼포먼스가 좀 더 뛰어나다. boost::variant는 n개의 타입이 될 수 있는 타입이다. union의 c++판 업그레이드 버전 정도 되는 라이브러리라고 생각해도 괜찮다. 또, c++17에 표준으로 포함 되었으며 c++ 관련 커뮤니티에서의 반응도 긍정적이다. 일단 사용하는 방법이 깔끔하고 쉬우니까.코드 >>#include boost::variant var; // setvar = 0.01;var = 123;var = "hello"; // getstd::string s = boost::get(var); 값을 얻을..
-
boost::any에서의 unsafe_any_cast프로그래밍/c++ 2016. 6. 6. 22:54
any_cast는 유도리가 없다. int로 넣은 것을 size_t로 읽으려고 하면 예외를 던진다. 실제 코딩을 함에 있어서도 int => unsigned int size_t => int같은 변환은 빈번한데, 안전한 캐스팅만을 보장해주는 any_cast가 야박하고 느꼈다면 unsafe_any_cast의 사용을 고려할 만 하다. 함수 시그니쳐 12345template const ValueType* unsafe_any_cast(const boost::any* operand) template ValueType* unsafe_any_cast(boost::any* operand)cs 사용 12345boost::any val = 1; boost::any_cast(val); // error! boost::unsafe_..
-
alignas, alignof 키워드프로그래밍/c++ 2016. 5. 7. 21:20
alignas 메모리의 정렬 단위를 지정하는 키워드로, 다음과 같이 사용합니다.(c++11 이상) 123456789101112131415161718// 4 바이트 단위로 정렬된 구조체struct alignas(4) foo{ int a; int b; char c;}; // 8 바이트 단위로 정렬된 구조체struct alignas(8) bar{ int a; int b; char c;}; sizeof(foo) // 결과는 12sizeof(bar) // 결과는 16cs 클래스, 구조체/공용 구조체 또는 개별 멤버에 alignas를 사용 가능하며 여러 alignas 지정자가 있을 경우, 컴파일러는 가장 엄격한 지정자(가장 큰 값의 지정자)를 선택합니다. 12345678910struct alignas(16) bar..
-
c++11과 14의 brace-or-equal-initializer프로그래밍/c++ 2016. 5. 3. 16:33
c++11 표준에 추가된 brace or equal initializer 코드로 보자면 이런 거다. 12345678910 // c++11에선 not aggregate type// c++14에선 aggregate typestruct flag{ const int bit = 0; const wchar_t* name = L""; const int sign = 0;}; cs 위의 코드는 c++11에서는 유효하지만 aggregate 타입이 아니게 된다는 애매한 부분이 생긴다. 그러나 c++14 표준부터 위 코드 역시 aggregate 타입이 되며 c++14부턴 아래 코드 컴파일에 성공한다. 1234 // c++14 표준에선 성공, c++11 표준에선 실패flag f{ 1, "hello", 1 }; cs 이에 대한 ..
-
함수에 주석 달기에 대한 생각프로그래밍/c++ 2016. 4. 24. 16:26
코딩을 하는데 함수 시그니쳐만으론 어떤 예외가 발생하는지 통 알 수가 없으니, std::exception으로 모든 예외를 잡는 상황이 종종 있었다. boost의 소스 코드는 발생하는 예외에 대해선 @throws [발생하는 예외의 종류] 같은 식으로 명시를 해놓았더라. 덕분에 어떤 예외가 발생하는지 파악하기 쉬웠다. 아쉬운 점이라면, 주석이 너무 빡빡하다는 점. 디테일한 설명을 하는 것도 장점도 있으니 이 부분은 취향 차이라고 본다. 나도 이 부분을 본받아서 주석을 달면 좋겠다는 생각을 했다. 이런식으로 주석을 작성하면, ide 단에서 함수의 설명은 다음과 같이 나온다. 그리고, ide 단에서 발생하는 예외에 대해서도 표시를 해줬으면 좋겠다. 지금 막 작성하는 코드에도 주석을 꼼꼼히 달면서 하긴 어려운데,..
-
iostream cerr, clog의 사용프로그래밍/c++ 2016. 4. 5. 20:32
cerr와 clog는 기본적으로, 콘솔로 출력해 이게 cout이랑 뭐가 다른 거야?! 라고 하겠지만스트림버퍼 설정으로 손 쉽게 에러와, 로그를 구분해 출력할 수 있도록 한다. 1234std::ofstream outfile("err.txt"); // set output streamstd::cerr.rdbuf(outfile);cs 이렇게 rdbuf를 재설정 하면, cerr로 출력한 문자들은 모두 outfile에 쓰여지게 된다! 123 std::cerr
-
c++] 시스템의 환경 변수 얻기 std::getenv프로그래밍/c++ 2016. 4. 4. 16:55
http://en.cppreference.com/w/cpp/utility/program/getenv std::getenv C++ Utilities library Program support utilitiesDefined in header char* getenv( const char* env_var );Searches the environment list provided by the host environment (the OS), for a string that matches the C string pointed to by env_var and returns a pointer to the C string that is associated with the matched environment list memb..