C++ 개념 뒤에 있는 개념

10182 단어 conceptscpp20cpp
개념의 개념은 C++20이 새로 추가한 주요 기능 중의 하나다.개념은 템플릿의 확장이다.그것들은 템플릿 매개 변수를 브리 술어를 통해 컴파일할 때 검증할 수 있다.그것들은 또한 유형의 속성에 따라 함수를 집행하는 데 사용될 수 있다.
개념에 대해 당신은 문법과 의미 조건을 동시에 필요로 할 수 있습니다.문법 요구사항의 경우, 어떤 종류의 API에서도 일부 함수를 강제로 사용할 수 있다고 가정합니다.예를 들어, Car이라는 개념을 만들 수 있습니다. 이 개념에는 accelerate 함수가 있어야 합니다.
#include <concepts>

template <typename C>
concept Car = requires (C car) {
  car.accelerate()
};
문법을 걱정하지 마라, 우리는 다음 주에 도착할 것이다.
의미의 수요는 수학의 공리와 더 많이 관련이 있다. 예를 들어 당신은 관련성이나 교환성을 고려할 수 있다.
a + b == b + a // commutativity
(a + b) + c == a + (b + c) // associativity
표준 라이브러리에는 의미의 수요를 표현하는 개념이 있다. std::equality_comparable 을 예로 들다.
요구 사항
  • 전송 유형 간의 두 가지 동일한 비교는 교환 가능,
  • ==은 대칭적, 전달적, 자반적이며,
  • 은 대칭적, 전달적, 자반적이다
  • equality_comparable_with<T, U>const std::remove_reference_t<T> 유형의 왼쪽 값 t와 const std::remove_reference_t<U>, 유형의 왼쪽 값 u만 정하고 C가 std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>bool(t == u) == bool(C(t) == C(u))일 때 모델링을 한다.
  • 그 다음 하나가 더 어려워질 수도 있지만어쨌든, 만약 당신이 의미의 수요에 관한 완전한 문장을 찾고 싶다면, this one by Andrzej Krzemieński을 읽으십시오.

    개념 배후의 동기
    우리는 이미 매우 높은 차원에서 우리가 개념으로 무엇을 표현할 수 있는지 간단명료하게 보았다.그런데 왜 저희가 먼저 얘네가 필요할까요?
    예를 들어 두 숫자를 더한 함수를 쓰고 싶다고 가정해 보세요.정수와 부동 소수점을 모두 받아들이기를 원합니다.너는 어떻게 할 작정이냐?doubles를 수락할 수 있으며, long doubles를 수락할 수도 있으며, 동일한 유형의 값을 반환할 수도 있습니다.
    #include <iostream>
    
    long double add(long double a, long double b) {
        return a+b;
    }
    
    int main() {
      int a{42};
      int b{66};
      std::cout << add(a, b) << '\n';
    }
    
    문제는 add()으로 int을 호출하면 long double으로 전환된다는 것이다.더 작은 메모리를 사용하거나, 형식의 최대 또는 최소 제한을 고려하길 원할 수도 있습니다.어쨌든 은식 전환에 의존하는 것이 가장 좋은 방법은 아니다.
    스텔스 변환은 당신의 의도에 부합되지 않는 코드를 컴파일할 수 있습니다.정의상, 이것은 결코 나쁘지 않지만, 은식 전환은 우연한 것이 아니라 의도적인 것이어야 한다.
    이런 상황에서 일부러 캐스팅을 펼치는 것은 무리라고 본다.
    다른 유형에 따라 리셋을 정의하는 것은 다른 방법이지만, 그것은 틀림없이 지루할 것이다.
    #include <iostream>
    
    long double add(long double a, long double b) {
      return a+b;
    }
    
    int add(int a, int b) {
      return a+b;
    }
    
    int main() {
      int a{42};
      int b{66};
      std::cout << add(a, b) << '\n';
    }
    
    상상해 봐, 너는 all the different numeric types을 위해 이 일을 하고 싶어.우리는 long doubles와 shorts의 조합에도 이렇게 해야 합니까?어...고마워요. 그런데 됐어요. 고마워요.
    다른 옵션은 템플릿을 정의하는 것입니다!
    #include <iostream>
    
    template <typename T>
    T add(T a, T b) {
        return a+b;
    }
    
    int main() {
      int a{42};
      int b{66};
      std::cout << add(a, b) << '\n';
      long double x{42.42L};
      long double y{66.6L};
      std::cout << add(x, y) << '\n';
    
    }
    
    CPP Insights을 보시면 코드가 intlong double을 다시 불러오는 것을 발견할 수 있습니다.어떤 점에서도 정적 투사가 일어나지 않는다.
    우리 됐어요?
    불행히도 없습니다.add(true, false)으로 전화해 보시면 어떨까요?1이 정수로 승급되면 truefalse과 더하여 정수로 승급한 다음에 그것들은 (static_cast)블로 변환됩니다.
    만약 네가 두 문자열을 더하면?그것들은 연결될 것이다.그런데 이게 정말 네가 원하는 거야?아마도 이것은 효과적인 조작이 되기를 원하지 않을 것이다. 번역에 실패하기를 더욱 원할 것이다.
    그래서 너는 어쩔 수 없이 이렇게 하는 것을 금지해야 할 것이다.몇 가지 유형에 대해서 당신은 같은 일을 하고 싶습니까?
    간단하게 말하면 포인트나 부동점 유형만 늘리고 싶어요.요컨대 이치에 맞다.여기는 concepts입니다.
    개념이 있으면 템플릿 매개 변수에 이런 수요를 쉽게 표현할 수 있습니다.
    너는 정확하게 요구할 수 있다
  • 표현식의 유효성(클래스의 API에 일부 함수가 있어야 함)
  • 일부 함수의 반환 유형
  • 내부 유형의 존재, 템플릿 전문화
  • 수용된 유형의 유형 특징
  • 어떻게 써요?이것이 바로 우리가 이 시리즈에서 탐구하고자 하는 C++ 개념이다.

    다음은요?
    다음 몇 주 동안 우리는 토론할 것이다.
  • 개념을 사용하는 4가지 방법
  • 표준 라이브러리에 도입된 사전 정의 개념
  • 개념 작성 방법
  • 기대해주세요!
    C++ 개념에 대한 자세한 정보를 알고 싶으면 check out my book on Leanpub을 클릭하세요!

    더욱 깊이 연락하다
    이 글이 재미있다면 subscribe to my personal blog을 눌러서 계속 연결합시다!

    좋은 웹페이지 즐겨찾기