C++ - 자주 사용하는 C++ 이디엄(idiom) No Copyable mix-in

계승된 클래스는 복사 금지라고 명쾌하게 표현할 수 있는 idiom 이다. class noCopyable{ noCopyable(const noCopyable&)=delete; noCopyable& operator=(const noCopyable&)=delete; protected: noCopyable()=default; ~noCopyable()=default; }; struct X:private noCopyable{}; CRTP를 이용한 구현 template<class> class noCopyable{ noCopyable(const noCopyable&)=delete; noCopyable& operator=(const noCopyable&)=delete; protected: noCopyable()=default; ~noCopyable()=default; }; struct...
더 읽기

C++ - 자주 사용하는 C++ 이디엄(idiom) cheked delete

규격에 의해 delete식에 의해 불완전 타입을 delete에 넘기는 것이 허가되고 있다. 그러나 trival 생성자가 아닌지, 독자적인 delete 연산자를 정의하고 있는 경우 미 정의 동작이 된다. 미정의 동작은 좋지 않으므로 delete 대상 형식이 불완전 타입인 경우 컴파일러에 에러를 내자는 idiom 이다....
더 읽기

C++ - 자주 사용하는 C++ 이디엄(idiom) CRTP

CRTP는 Curiously Recurring Template Pattern의 약어로 자주 직역되고 있지만 기묘하게 재기한 템플릿 패턴이라고 부른다. template<class Inher> struct X{}; struct Derived:X<Derived>{}; // CRTP 기본 클래스에서 파생 클래스를 볼 수 있으므로 이것을 이용한 다양한 패턴도 다시 생겨나고 있다. 예를 들면 순수 가상...
더 읽기

C++ - 자주 사용하는 C++ 이디엄(idiom) Detection

C++17에서 type_traits 헤더에 추가된 std::void_t를 이용한 idiom 이다. std::void_t의 구현은 아래처럼 되어 있다. template<class...> using void_t=void; 뭘 넣어도 void를 반환하므로 넢고 싶은 것을 마음대로 넣을 수 있다. 아래의 예는 클래스가 반복자를 가지고 있는가를 조사하는 것이다. template<class,class=std::void_t<>> constexpr bool has_iterator_v=std::false_type::value; template<class...
더 읽기

C++ - 자주 사용하는 C++ 이디엄(idiom) pimpl

Pimpl(Pointer to IMPLementation)은 구현을 숨기거나, 헤더를 바꾸지 않는 것으로 컴파일을 속도를 고속화 할 때 사용한다. C++20의 module에서는 필요 없어지겠지만 아직은 필요하다 hoge.h class Hoge { int foo_; void baz(); public: int bar(); Hoge() = default; ~Hoge() = default; }; hoge.cpp...
더 읽기

C++17 - 시간 반올림 연산

밀리 세컨드를 세컨드 단위로 변경할 때 딱 맞아 떨어지지 않는 경우 반올림 혹은 내림을 할 수 있는 floor(내림), ceil(올림), round(가장 근접한 수로)가 생겼다. #include <iostream> #include <chrono> using namespace std::chrono; int main() { milliseconds ms(2500); seconds sec1 = round<seconds>(ms); //...
더 읽기

C++17 - 연관 컨테이너의 extract, merge, insert

2개의 연관 컨테이너를 접합(splice)하는 기능이 생겼다. map, set, unordered_map, unordered_set와 이 들의 multi 버전 모두도 포함된다. 특정 요소 추출 extract() 멤버 함수를 사용하면 컨테이너의 특정 요소를 추출 할 수 있다. node_type extract (const_iterator position); node_type extract ( const key_type &...
더 읽기

C++11 - map에 삽입 insert, emplace

아래 방식은 unordered_map에도 적용된다. map::insert insert를 사용하면 key와 value의 pair를 삽입할 수 있다. map<int,int> dic{}; dic.insert(std::make_pair(1,3)); map::emplace insert와 비슷하지만 이쪽은 값을 key와 value의 생성자에 전송한 값을 구축한다. std::map<int,int> dic{}; dic.emplace(1,3); // dic.insert(std::make_pair(1,3))와 같다 귀찮게 pair를 만들지 않아서 좋다.
더 읽기