C++ 개념 뒤에 있는 개념
개념에 대해 당신은 문법과 의미 조건을 동시에 필요로 할 수 있습니다.문법 요구사항의 경우, 어떤 종류의 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))
일 때 모델링을 한다.개념 배후의 동기
우리는 이미 매우 높은 차원에서 우리가 개념으로 무엇을 표현할 수 있는지 간단명료하게 보았다.그런데 왜 저희가 먼저 얘네가 필요할까요?
예를 들어 두 숫자를 더한 함수를 쓰고 싶다고 가정해 보세요.정수와 부동 소수점을 모두 받아들이기를 원합니다.너는 어떻게 할 작정이냐?
double
s를 수락할 수 있으며, long double
s를 수락할 수도 있으며, 동일한 유형의 값을 반환할 수도 있습니다.#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 double
s와 short
s의 조합에도 이렇게 해야 합니까?어...고마워요. 그런데 됐어요. 고마워요.다른 옵션은 템플릿을 정의하는 것입니다!
#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을 보시면 코드가 int
과 long double
을 다시 불러오는 것을 발견할 수 있습니다.어떤 점에서도 정적 투사가 일어나지 않는다.우리 됐어요?
불행히도 없습니다.
add(true, false)
으로 전화해 보시면 어떨까요?1
이 정수로 승급되면 true
을 false
과 더하여 정수로 승급한 다음에 그것들은 (static_cast
)블로 변환됩니다.만약 네가 두 문자열을 더하면?그것들은 연결될 것이다.그런데 이게 정말 네가 원하는 거야?아마도 이것은 효과적인 조작이 되기를 원하지 않을 것이다. 번역에 실패하기를 더욱 원할 것이다.
그래서 너는 어쩔 수 없이 이렇게 하는 것을 금지해야 할 것이다.몇 가지 유형에 대해서 당신은 같은 일을 하고 싶습니까?
간단하게 말하면 포인트나 부동점 유형만 늘리고 싶어요.요컨대 이치에 맞다.여기는
concepts
입니다.개념이 있으면 템플릿 매개 변수에 이런 수요를 쉽게 표현할 수 있습니다.
너는 정확하게 요구할 수 있다
다음은요?
다음 몇 주 동안 우리는 토론할 것이다.
C++ 개념에 대한 자세한 정보를 알고 싶으면 check out my book on Leanpub을 클릭하세요!
더욱 깊이 연락하다
이 글이 재미있다면 subscribe to my personal blog을 눌러서 계속 연결합시다!
Reference
이 문제에 관하여(C++ 개념 뒤에 있는 개념), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sandordargo/the-concept-behind-c-concepts-5ajm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)