C++ - idiom - Construction Tracker

원문 생성자에서 멤버 초기화 때 예외가 발생하는 경우가 있더. try와 catch로 예외를 잡을 수는 있지만 때로는 아래와 같이 어디에서 예외가 발생했는지 알 수 없을 때가 있다. class A { public: A(int n) { /* 초기화에 실패해서 예외를 던진다 */ throw...
더 읽기

C++ - idiom - Construct on First Use

원문 정적 오브젝트는 주의하지 않으면 초기화 되기 전에 사용하는 실수를 할 수 있다. 아래는 그 예이다. #include <iostream> class StaticObject { public: StaticObject() { std::cout << "StaticObject::StaticObject()" << std::endl; } void callMethod() { std::cout << "StaticObject::callMethod()" << std::endl; } };...
더 읽기

C++ - 자주 사용하는 C++ 이디엄(idiom) Coercion by Member Template

클래스 B가 A에서 파생되어 B 타입 객체에 대한 포인터는 A 타입의 포인터에 대입할 수 있지만 이들 타입의 복합 타입은 바탕이 된 타입의 관계를 공유하지 않는다. 예를 들면 template_class는 template_class에 대입할 수는 없다. class A{}; struct B:A{}; template<class T> class template_class{};...
더 읽기

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...
더 읽기