C++ - ref-qualifier 유무로 오버로드 할 수는 없다

출처 C++11에는 implicit object parameter(*this를 참조하는 객체)를 lvalue 참조로 받거나 rvalue 참조로 받는지를 지정하는 기능이 있다. 이를 참고 참고 수식자(ref-qualifier)라고 한다. struct S { // void S::f(void) & void f() & ; // void S::f(void) && void f() && ;...
더 읽기

C++ - Virtual 전파

이 Box 클래스를 public 계승해도 안전할까? class Box : public Object { public: Box(); ~Box(); }; 정답은…이 정보만으로는 뭐라고 말할 수 없다 이다. 얼핏 보면 안 되다고 느끼는 사람도 많을 걸로 생각한다.특히 c++를 좀 알게 되었을 때의 사람은 우선 소멸자에...
더 읽기

C++ - PLAIN OLD DATA

출처 C++의 POD(Plain Old Data)는 C언어의 데이터와 호환을 가진 데이터 구조이다. memcpy로 데이터를 복사하거나 하지만 그것은 본질적인 것이 아니지만 어쨌든 POD의 가장 큰 의미는 C 언어의 데이터와 bit 수준으로 완전히 호환을 갖는다는 것이다. C++과 C 언어의 프로그램이 있을 경우 교환하는...
더 읽기

C++ - 함수 템플릿의 포인터를 함수로 받기

출처 C++11 이상 가능. // 템플릿의 default 값에 함수 포인터 타입을 정의 template<typename T, typename Func = T(*)(T, T)> constexpr T calc(T a, T b, Func func){ return func(a, b); } template<typename T> constexpr T plus(T a, T b){ return...
더 읽기

C++ - 생성자에 용도 별로 이름 붙이기

최근 C++ 표준 라이브러리와 Boost의 작은 유행으로 태그 디스패치의 태그를 사용자에게 명시적으로 지정하게 함으로써 함수 오버로드를 손쉽게 하는 방법이 몇몇 곳에서 나타나고 있다. // Boost.Container의 vector의 예 // 태그 정의 struct default_init_t {}; constexpr default_init_t default_init {}; // vector 생성자...
더 읽기