공용체를 개선하여 C++ 수정
2557 단어 cppprogramming
비디오 형식의 전체 연습은 내 채널here에 있습니다.
우리는 모두 개체 지향 프로그래밍의 깊이 중첩된 계층 구조를 경험하고 "더 나은 방법이 있습니까?"라고 스스로에게 물었습니다. 글쎄요, 제 생각에는 C++와 C에서 상속된 대로 이미 꽤 좋은 대답이 있었습니다.
적어도 내 유산의 대부분은 다양한 유형을 공통 멤버 또는 기능을 가진 하나로 그룹화하려는 것입니다. 예를 들어, Liam에는 'IfStatement', 'ScopeStatement' 등과 같은 다른 많은 문 유형에 의해 상속되는 'Statement' 구조체가 있습니다. 내가 언급하는 내용에 대해 필요하지 않거나 신경 쓰지 않을 수 있으므로 이것들을 묶고 그냥 '진술'로 참조하는 것이 좋습니다.
많은 구조체를 포함하고 현재 공용체 유형의 일부 ID를 갖는 공용체를 사용하여 C에서 이것을 어느 정도 시뮬레이트할 수 있습니다.
struct Statement {
StatementType type;
union {
IfStatement if_statement;
ScopeStatement scope_statement;
LetStatement let_statement;
};
};
이는 상속과 동일한 기능을 제공하지만 한 가지 문제가 있습니다. 문의 if를 항상 확인해야 합니다. 이것이 일반적으로 안전하지 않은 것은 아니지만 유형을 초기화하지 않으면 여전히 유효한 값을 제공하는 것과 같은 문제가 발생할 수 있습니다.
이것을 시도하고 돕기 위해 Typed Unions를 제 언어에 추가했으며 이것이 어떻게 작동하는지 보여줍니다. 아래 이미지에서 'x'에 대한 유형 지정자는 and/s 의미 체계를 나타내는 파이프로 구분된 여러 유형임을 볼 수 있습니다.
fn main(): void {
let x: u64 | bool | str = "hello sailor!";
}
이것은 x의 값이 숫자, 부울 또는 문자열일 수 있음을 보여주지만 확실히 알려지지 않았습니다. 이것은 또한 구조체 유형으로 확장되어 C 공용체의 동작을 복제할 수 있습니다. 그러나 여전히 한 가지가 더 있으며 유형이 안전한 방식으로 x에서 실제 값을 얻는 방법입니다.
fn main(): void {
let x: u64 | bool | str = "hello sailor!";
if x is str as_string {
println[str](*as_string);
}
}
당신이 하는 모든 것은 'is 표현식'입니다. 이것은 변수에 현재 저장된 값이 우리가 요청하는 값이면 true를 반환하고, 그렇다면 이 예에서 'as_string' 식별자인 해당 값에 대한 포인터를 제공합니다. . 이 새로운 식별자는 여러 유형에 대해 반복될 수 있음을 의미하는 if 블록으로 범위가 지정됩니다.
이것이 유용한 또 다른 영역은 오류 처리입니다. 저는 개인적으로 Zig가 오류를 처리하는 방법을 정말 좋아하며 이러한 새로운 Typed Union을 통해 얻을 수 있습니다.
fn main(): void {
if add(10, -20) is u64 n {
print[u64](*n);
}
}
fn add(x: i64, y: i64): u64 | str {
let result := x + y;
if result < 0 {
return "Error negative number";
}
}
이 예제는 조금 더 복잡하지만 내 add 함수의 반환이 이제 숫자이거나 문자열이 내 오류 메시지인 문자열임을 알 수 있습니다. 그런 다음 이전에 표시된 is 표현식을 사용하여 함수 호출이 완료되었는지 확인할 수 있습니다.
이 게시물이 마음에 들거나 언어에 기여하고 싶다면 githubhere에서 확인하십시오.
Reference
이 문제에 관하여(공용체를 개선하여 C++ 수정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jackdelahunt/fixing-c-by-making-unions-better-f47텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)