C++에서 정적 다형성 구현

Syed Hassan Sabeeh Kazmi 2023년10월12일
  1. C++에서 정적 다형성의 메커니즘을 배우기 위해 흥미롭게 반복되는 템플릿 패턴 이해
  2. C++에서 정적 메커니즘의 유용성을 배우기 위한 정책 기반 설계 이해
  3. C++에서 초기 바인딩, 오버로딩 또는 파라메트릭 다형성을 사용하여 정적 다형성 구현
C++에서 정적 다형성 구현

정적 다형성은 주로 C++ 컨텍스트에서 해석될 수 있습니다. 이 튜토리얼에서는 중요성, 유용성 및 C++에서 정적 다형성을 구현하는 방법을 알려줍니다.

C++의 std:sort 함수는 개체 제공 인터페이스(반복처럼 작동하는 개체)에 대한 종속성 때문에 정적으로 다형성입니다.

또한 인터페이스에서 제공되는 반복(개체)의 정확한 동작은 컴파일 시간에 결정될 수 있습니다.

C++에서 정적 다형성의 메커니즘을 배우기 위해 흥미롭게 반복되는 템플릿 패턴 이해

정적 다형성을 구현하는 것은 좋은 코딩 스타일입니다. 이렇게 하려면 CRTP를 통해 메커니즘을 배워야 합니다. 속도를 위해(정적 다형성을 통해) C++ 프로그램의 유연성을 어느 정도 희생해야 한다는 것은 사실입니다.

기술적인 다형성 동작을 보여주고, 다른 유형과 다른 목표를 달성하고, 유형에 따라 실행하고 우선 순위를 지정할 코드를 결정합니다.

또한 컴파일러가 구현을 이해할 수 있도록 각 번역 단위에서 이진 코드 크기 팽창 및 검사를 초래할 수 있는 구현이 필요합니다.

#include <iostream>

template <class Self>
struct Primary {
  Self& self() { return static_cast<Self&>(*this); }

  // an algorithm to perform some function
  int basic_function(int x) {
    self().prologue();
    if (x > 42) x = self().downsize(x);
    x = self().crunch(x);
    self().epilogue();
    return x;
  }

  void prologue() {}

  int downsize(int x) { return x % 42; }

  int crunch(int x) { return -x; }

  void epilogue() {}
};

struct secondary_Derived : Primary<secondary_Derived> {
  int downsize(int x) {
    while (x > 42) x /= 2;
    return x;
  }

  void epilogue() {
    std::cout << "CRTP__ \n"
              << "Process complete! \n";
  }
};

int main() {
  secondary_Derived obj_Dri;
  std::cout << obj_Dri.basic_function(420);
}

출력:

CRTP__
Process complete!
-26

CRTP를 사용하면 기본 클래스가 파생 클래스 측면에서 정보 또는 데이터를 제공할 수 있으며 대부분의 사용 사례는 동일합니다. 예: Boost의 iterator_facade.

signatures는 CRTP의 멤버 함수이며 DerivedClass operator++() {/* Return *this after incrementation */}과 같은 항목은 이 멤버 함수에서 파생됩니다.

C++ 코드에 다형성 출력 동작이 필요한 경우 std::sstream vs std::fstream vs std::cout(유형이 지정되지 않은 경우에도) 다형성이며 ostream에서 파생됩니다. CRTP는 F-바운드 정량화의 한 형태이므로 F-바운드 다형성으로 알려져 있습니다.

유연성 비용 없이 가상 기능을 달성할 수 있으며 때로는 시뮬레이트된 동적 바인딩이라고 합니다.

Windows STL 및 WTL 라이브러리는 이 기능을 사용하며 Barton-Nackman 트릭은 C++ 코드를 최소화하는 기본 클래스에 공통 기능을 배치할 수 있는 제한된 템플릿 확장이라고도 하는 정적 다형성의 유사한 사용입니다. 중복성.

C++에서 정적 메커니즘의 유용성을 배우기 위한 정책 기반 설계 이해

C++에서 정적 다형성을 달성하는 매우 강력한 기술 중 하나입니다. 최신 C++ 디자인에서 정책 기반 클래스 또는 정책 기반 프로그래밍은 정책으로 알려진 C++ 관용구를 기반으로 하는 디자인 접근 방식입니다.

전략 패턴의 컴파일 타임 변형은 모듈성을 높이고 직교 디자인 결정을 강조합니다.

그것은 혁신을 나타내는 상대적으로 낮은 수준에서 개별 클래스의 동작을 정의하는 반면 상호 교환 가능한 모듈에서 소프트웨어 구성 요소를 조립하는 것은 새로운 개념이 아닙니다.

#include <windows.h>

#include <iostream>

struct color_code {
  void pri_color() { this->reveal_colorCode(); }

  void reveal_colorCode() {
    std::cout << "The color code is revealed!" << std::endl;
  }
};

struct banner_code {
  void pri_color() {
    std::cout << "The banner code is revealed to the officials!" << std::endl;
  }
};

template <class code_type>

class Info : public code_type {
 public:
  void code_implementation() { code_type::pri_color(); }
};

int main() {
  Info<color_code> lordcommander;
  lordcommander.code_implementation();

  Info<banner_code> kingslayer;
  kingslayer.code_implementation();
  return 0;
}

출력:

The color code is revealed!
The banner code is revealed to the officials!

이를 통해 컴파일 시간에 대한 패턴(예: 템플릿 메서드 패턴)을 재해석할 수 있으므로 기본 클래스에 개별 정책의 적절한 기능을 호출하는 골격 알고리즘이 있습니다(사용자 지정 지점에서).

일반적으로 이러한 디자인에는 상속이 필요하지 않으며 대부분의 기능은 정적 다형 동작을 반영합니다.

C++에서 초기 바인딩, 오버로딩 또는 파라메트릭 다형성을 사용하여 정적 다형성 구현

객체 메서드는 컴파일 타임에 호출되며 일반적으로 연산자 및 함수 오버로딩을 사용하여 구현됩니다.

메소드 오버로딩은 둘 이상의 메소드가 이름은 같지만 매개변수 목록과 유형이 다른 컴파일 타임 다형성입니다.

컴파일 시간에 방법이 알려지기 때문에 성능이 향상되어 실행 속도가 빨라지지만 솔루션 구현의 유연성이 떨어집니다.

함수 오버로딩 및 연산자 오버로딩은 코드의 기능을 확장하기 위한 오버로딩 기능을 제공하므로 정적 다형성 동작을 반영합니다.

#include <windows.h>

#include <iostream>

// parametric polymorphism
template <class T>

T max(T a, T b) {
  return a > b ? a : b;
}

// early binding | static binding
class Base {
 public:
  void show() { std::cout << "\nIn Base \n"; }
};

class Derived : public Base {
 public:
  void show() { std::cout << "In Derived \n"; }
};

// override
void swap(int* a, int* b){

};

void swap(double* a, double* b){

};

int main() {
  int x = 10, y = 20;
  double a = 1.2, b = 3.4;

  // overloading | as static polymorphism
  swap(&x, &y);  // swap(int,int)
  swap(&a, &b);  // swap(double, double)

  // parametric polymorphism | as static polymorphism
  std::cout << ::max(9, 5) << std::endl;

  std::string foo("kingslayer"), bar("widow'swale");
  std::cout << ::max(foo, bar) << std::endl;

  // early binding or static binding | as static polymorphism
  Base* bp = new Derived;
  bp->show();

  return 0;
}

출력:

9
widow'swale

In Base

UML 다이어그램은 다형성이 처리되는 방식을 직접 설명할 수 없지만 최소한 부분적으로는 정적 또는 동적으로 구현될 수 있습니다(OOP 모델의 정적 다형성 종속성에 따라 다름).

런타임이 아닌 컴파일 타임에 정적 다형성 동작이 발생할 때 간접 호출의 성능 영향을 제거할 수 있습니다.

가장 중요한 것은 성능이 정적 다형성의 주요 이점이며 PBD(Policy Based Design) 및 CRTP(Curiously Recurring Template Pattern)는 이 기술이 얼마나 강력한지 보여주는 완벽한 예입니다.

컴파일러와 옵티마이저에 엄청나게 중요한 정보를 제공하고, 컴파일 타임에 가정을 확인하고, 프로그램 실행을 위한 중요한 옵션 중에서 선택할 수 있습니다.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub