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); 값을 얻을..
-
c++ 파일 저장 시 로케일로 인한 깨짐 문제프로그래밍/의문 2016. 7. 5. 10:29
std::wofstream을 통해 한글과 영문, 숫자가 섞인 로그를 기록하려고 했다. 코드>> std::wofstream of(L"C:\\Users\\user\\Desktop\\test.txt"); of FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read);StreamReader sr = new StreamReader(fs, UnicodeEncoding.Unicode); sr.ReadLine() .. ?! 이상한 문자가 읽어지네 위 코드는 StreamReader sr = new StreamReader(fs, UnicodeEncoding.Unicode); 부분을 StreamReader sr = new StreamReader(fs, Unic..
-
Parse std::string with boost ptree프로그래밍/코드 조각 2016. 6. 16. 01:53
1234567891011121314151617181920212223#include #include #include #include #include namespace pt = boost::property_tree; std::string ss = "{ \"item1\" : 123, \"item2\" : 456, \"item3\" : 789 }"; int main(){ // Read json. pt::ptree pt2; boost::iostreams::array_source as(&ss[0], ss.size()); boost::iostreams::stream is(as); pt::read_json(is, pt2); std::cout
-
반환된 임시 개체 사용으로 인한 종종 프로그램이 터지던 문제프로그래밍/의문 2016. 6. 15. 21:50
함수 GetID는 string 개체를 반환한다. 그리고 Execute 함수는 GetID로 받아온 string 내부 리소스 포인터를 반환하는 함수인 c_str()을 사용한다. 위 코드에서 무엇이 문제인지 짐작했는가? cBot.GetID()로 받아온 string 개체는 다음 라인에서 제거 된다는 것이다. 그러나 위 코드는 정상적으로 동작 "했었다" string은 분명 제거되었으나, 스택(또는 힙)에 남아있던 데이터가 지워지지 않고 남아있었기 때문이다. 그러다가 프로그램이 터진 후 문제를 찾는데, 좀처럼 찾기가 어려웠다.(20분은 걸린 듯 ㅡㅡ;) ResetSession, ConnectServer까진 정상적으로 사용이 되었는데 뜬금 없이 ProcessLogin에서 터지네? 어? 근데 아까 strKeyID는 값..
-
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 이에 대한 ..