본문 바로가기

프로그래밍206

[C++] 템플릿과 상속 (EBCO, CRTP) References Ch 21, C++ Templates The Complete Guide Contents The Empty Base Class Optimization (EBCO) The Curiously Recurring Template Pattern (CRTP) The Empty Base Class Optimization (EBCO) 비어있는(empty) C++ 클래스는 런타임에서 메모리를 요구하는 내부 표현이 없다는 것을 의미한다. 일반적으로 타입 멤버, nonvirtual 함수 멤버, 그리고 static 데이터 멤버만을 갖는 클래스를 empty class 라고 한다. 반면, nonstatic 데이터 멤버, virtual 함수, 그리고 virtual base 클래스는 런타임에 메모리를 필요로 한다... 2023. 12. 29.
[C++] Typelists Reference Ch 24, C++ Templates The Complete Guide Contents Typelists Typelist Algorithms Nontype Typelists Optimizing Algorithms with Pack Expansions Cons-style Typelist 효과적인 프로그래밍을 위해서는 다양한 데이터 구조가 필요하다. 메타프로그래밍에서도 동일한데, 메타프로그래밍에서 핵심이 되는 데이터 구조는 타입리스트(typelists)이다. 말 그대로 타입을 포함하고 있는 리스트를 의미한다. 템플릿 메타프로그램은 이러한 타입리스트들을 가지고 조작하면서 실행 프로그램 일부를 만들어낼 수 있다. 이번 포스팅에서는 타입리스트를 다루는 기법에 대해서 살펴볼 예정이다. 타입리스트에.. 2023. 12. 23.
[C++] 메타프로그래밍 Reference Ch 23, C++ Templates The Complete Guide Contents The State of Modern C++ Metaprogramming The Dimensions of Reflective Metaprogramming The Cost of Recursive Instantiation Enumeration Values versus Static Constants 메타프로그래밍(metaprogramming)이란 '프로그램을 프로그래밍하는 것'이다. 즉, 실제로 원하는 기능을 구현하는 새로운 코드를 생성하도록 실행되는 프로그래밍 시스템을 작성하는 것이다. 일반적으로 메타프로그래밍이라는 용어는 반사적(reflexive) 속성을 내포한다. 메타프로그래밍 컴포넌트는 일부 코드를.. 2023. 12. 16.
[C++] Type Erasure Reference Ch22, C++ Template The Complete Guide Contents Function Objects, Pointers, and std::function Bridge Interface Type Erasure Optional Bridging (for lambda) C++에는 정적 다형성(static polymorphism - via template)과 동적 다형성(dynamic polymorphism - via inheritance and virtual function)이 있다. 코드를 작성할 때 두 종류의 다형성으로 강력한 추상화가 가능하지만, 각각에는 장단점이 있다. 정적 다형성은 다형성이 적용되지 않은 일반 코드와 같은 성능을 갖지만, 런타임에 사용할 수 있는 타입 집합.. 2023. 12. 15.
[C++] Overloading on Type Properties References Ch 20, C++ Templates The Complete Guide Contents Algorithm Specialization Tag Dispatching Enabling/Disabling Function Templates 함수 오버로딩(function overloading)은 같은 함수 이름을 여러 함수에서 사용할 수 있도록 하는 것이다. 단, 이러한 함수들은 이 함수들의 파라미터로 구별된다. void f(int); void f(char const*); 함수 템플릿(function templates)에서는 타입 패턴에 오버로드된다. template void f(T*); template void f(Array); Type traits를 생각해 보면 템플릿 인자의 속성을 기반으로 .. 2023. 11. 25.
[C++] Traits(특질) 구현 (3) References Ch 19, C++ Templates The Complete Guide Contents If-Then-Else Detecting Nonthrowing Operations Traits Convenience Type Classification Policy Traits If-Then-Else 아래와 같이 정의된 PlusResultT trait는 HasPlusT 라는 다른 traits에 따른 완전히 다른 구현을 가지고 있다. template struct HasPlusT : std::false_type {}; template struct HasPlusT : std::true_type {}; template struct PlusResultT { using Type = decltype(std::d.. 2023. 11. 24.
[C++] 값으로 전달과 참조로 전달 (std::ref(), std::cref()) References Ch7, C++ Templates The Complete 2nd Contents Passing By Value Passing By Reference Using std::ref() and std::cref() Dealing with String Literals and Raw Arrays Dealing with Return Values C++이 처음 나왔을 때부터 call-by-value(값으로 전달)와 call-by-reference(참조로 전달)을 모두 제공한다. 일반적이지 않은 객체를 전달할 때는 참조로 전달하는게 더 나을 때가 많지만 값으로 전달보다 더 복잡하다. C++11부터는 이동 의미론 개념이 생기면서 참조로 전달하는 방법이 아래와 같이 더욱 다양해졌다. X const& (.. 2023. 7. 11.
[C++] Traits(특질) 구현 (2) - SFINAE References Ch 19, C++ Templates The Complete Guide Contents SFINAE-Based Tratis IsConvertibleT Detecting Members SFINAE-Based Tratis SFINAE (substitution failure is not an error; 치환 실패는 에러가 아님) 원칙으로 인해 템플릿 인자를 추론하는 동안 형성되는 유효하지 않은 타입과 표현식은 에러가 아닌 단순히 추론 실패로 취급됩니다. 따라서 다른 오버로딩 후보를 선택할 수 있습니다. 원래 SFINAE는 함수 템플릿 오버로딩에서 발생할 수 있는 가짜 에러를 피하기 위해 도입되었지만, 현재는 특정 타입이나 표현식이 유효한지를 컴파일 과정에 결정할 수 있는 훌륭한 기법으로 .. 2023. 2. 2.
[C++] Traits(특질) 구현 (1) References Ch 19, C++ Templates The Complete Guide Contents Example: Accumulating a Sequence Traits versus Policies and Policy Classes Type Functions 템플릿을 활용하면 다양한 타입으로 클래스와 함수를 파라미터화할 수 있습니다. 템플릿을 타입이나 알고리즘에 맞춰 커스터마이징할 수 있도록 최대한 많은 템플릿 파라미터를 도입하도록 할 수도 있고, 클라이언트 코드의 정확한 니즈를 충족시키도록 템플릿화된 컴포넌트를 인스턴스화시킬 수도 있습니다. 다만, 실질적으로 수십 개의 템플릿 파라미터를 사용하는 것은 그리 좋지는 않습니다. 다행히 왠만한 경우, 추가하고 싶은 파라미터의 대부분은 기본값을 가지고.. 2023. 1. 18.
[C++] 템플릿 특수화(Specialization) References Ch16, C++ Templates The Complete Guide Contents Template Specialization Overloading Function Templates Explicit Specialization Partial Class Template Specialization Partial Variable Template Specialization C++ 템플릿을 사용하여 제너릭한 정의를 사용하여 관련된 클래스, 함수, 또는 변수로 확장할 수 있습니다. 이것만으로도 강력하지만 특정 템플릿 파라미터에서는 제너릭 형태의 연산이 최적이 아닐 수 있습니다. 제너릭 프로그래밍을 지원하는 다른 프로그래밍 언어와 달리 C++에서는 제너릭 정의를 좀 더 특수화된 기능으로 바꾸는 기.. 2023. 1. 15.