Type Category Testing_1(형 카 검-내장타입)
2022. 7. 3. 13:43
C++
헤더는 유틸리티를 제공함. Traits Effect is_void void is_integral int류, bool, char, char16, char32_t, wchar_t it_array 내장 배열형, std::array는 클래스 형임 is_pointer 포인터형, 함수 포인터 포함, static 들어간 멤버 함수 포인터 is_null_pointer nullptr 형식 is_member_object_pointer non-static 멤버 is_member_function_pointer non-static 멤버 함수 포인터 is_lvalue_reference lvalue 레퍼런스 is_rvalue_reference rvalue 레퍼런스 is_enum 열거형 is_class 클래스/구조체 is_union..
[C++] Return Value Optimization(RVO)
2021. 1. 4. 01:56
C++
Return Value Optimization 이하 RVO 및, Named RVO(NRVO) 와 Copy-Elision 은 C++98 시절부터 도입됬으며, 런타임 퍼포먼스를 향샹시키는 기능을 한다. // Example.1 RVO #include using namespace std; struct Rain { // Note: All methods have side effects Rain() { cout int { Rain drop = RainDrop(); drop = RainDrop(); } // 출력결과 // c'tor // c'tor // move assignment // d'tor // d'tor // Returning Member struct RainWrapper{ Rain rain; }; Rain ..
std::exception과 Stack Unwinding 과 RAII
2020. 12. 4. 22:56
C++
std::exception 의 파생 클래스 logic_error invalid_argument 부적절한 argument value | std::bitset::bitset, std::stoi, std::stof domain_error 루트안에 음수를 넣었다거나 하는, 논리상의 도메인을 벗어난 에러, 스탠다드 라이브러리는 이 에러를 출력하지 않음, math_errhandling 같은 자체 에러가 있음. 그러나 boost.math 같은 써드파티 라이브러리에서는 이 에러를 출력함 | boost.math length_error 객체의 한계를 벗어난 시도를 했을때 일어남 | std::basic_string, std::vector::reserve out_of_range 정의된 범위에서 벗어난 원소에 접근하는 시도를 ..
[레거시 코드] 함수포인터, 보이드포인터
2020. 12. 3. 07:18
C++
함수 포인터 런타임에서 어떤 함수를 실행할 것인지 정하는 기능을 가지고 있음 C 에서는 함수포인터만 사용이 가능함, 당연히 C++에서도 사용이 가능함 C++ 에서는 polymorphism이 구현되면서 서브클래스의 메소드를 호출할 수 있음 C++11 에서는 람다 표현식이 추가되면서 코드 자체를 삽입할 수 있음 Example.1 옛날 버전의 C++을 사용하는 레거시 코드에서는 typedef 를 통해서 함수를 호출함 클래스 내부의 함수 포인터는 약간 복잠함 #include using namespace std; // case.1 일반적인 함수 포인터 + 네임스페이스 함수포인터 int add(int a, int b) { return a + b; } int subtract(int a, int b) { return ..
[C++] 범위기반 for 루프를 위한 클래스 템플릿 최소 구현
2020. 11. 16. 05:22
C++
반복자를 증가시키는 operator++ 반복자를 역참조하고 반복자가 가리키는 값에 접근하는 operator* 다른 반복자와 비항등성을 비교하는 operator!= begin(), end() 함수 #include #include template class dummy_array { private: T data[Size] = {}; public: const T& GetAt(const size_t idx) const { if (idx < Size) { return data[idx]; } throw std::out_of_range("index out of range"); } void SetAt(const size_t idx, const T& value) { if (idx < Size) { data[idx] = v..
스마트 클래스
2020. 11. 15. 03:34
C++
#include "Precompiled.h" namespace DevMil { template class unique_handle { typedef typename Traits::pointer pointer; pointer m_value; auto close() throw() -> void { if (*this) { Traits::close(m_value); } } unique_handle(unique_handle const &); auto operator=(unique_handle const &) -> unique_handle &; public: explicit unique_handle(pointer value = Traits::invalid()) throw() : m_value { value } { ..
클래스 구현 시, 생각해야 할 것
2020. 11. 14. 12:51
C++
클래스 구현 시 생각할 목록은 다음과 같다. (Mutability에 대한 정확한 한글 단어를 찾을 수 없어서 그냥 영어로 통일했음) Constructor/Destructor Mutability Member functions Helper functions Static members Operator overloading Namespaces 1. 클래스 템플릿을 구현하는 것이 매우 매우 유용하기는 하지만, 모든 경우의 수를 커버할 수 없을 때, 해당 케이스에 대해서 명시적으로 클래스를 구현해야 한다. 2. 객체의 생성과 소멸은 생성자와 소멸자에서 처리해야 하며, 다른 함수에 떠넘겨서는 안 된다. 또한 일반적인 상황에서의 복사, 이동 연산에 대해서도 고려해야 한다. 3. 어디까지 비상수/상수 접근을 허용할 것인..
윈도우 HANDLE 과 COM 인터페이스에 대해서.
2020. 11. 14. 12:15
C++
1. 클래스 디자인을 논하기 전에, 핸들은 래퍼이다. 2. 리소스를 관리하고 수명을 다루는 클래스 템플릿은 핸들에 의해서 컨트롤 된다. 이러한 접근 방법은 C 스타일 API에서도 그렇고, 이식성(binary portability)를 요구하는 최근의 API들과도 공통적인 사항이다. 3. 윈도우 OS를 예로 들자면, 윈도우 API는 리소스와 디바이스, 알고리즘 같은 것들을 핸들이나 COM 스타일 인터페이스 포인터의 형태로 노출시킨다. 4. 그러나 핸들은 COM 인터페이스 포인터보다는 덜 직접적으로 시스템 오브젝트를 노출한다. 5. virtual 함수를 통한 호출보다는 핸들과 함께 독립적이거나 비맴버 함수를 통한 노출을 뜻한다. 6. 핸들 객체를 직접적으로 수정할 수 없기 때문에, 클래스 템플릿을 정의하고 수..