C++23에서 std::expected에 std::apply 사용

C++

C++23의 오류 처리 간소화

실수를 효과적으로 처리하고 반환 값을 관리하는 것은 오늘날의 C++ 개발에 필수적입니다. {std::expected} 유형을 반환하는 함수로 작업하는 일반적인 방법에는 많은 검사와 오류 처리 코드가 포함되어 있어 논리가 복잡해지고 코드 유지 관리가 더 어려워질 수 있습니다.

이 문서에서는 오류 관리를 단순화하기 위해 보다 정교하고 일반적인 방법을 사용하는 방법을 조사합니다. 상용구 코드를 줄이고 가독성을 높이기 위해 많은 {std::expected} 값의 결과를 집계하고 이를 다른 함수에 전달하는 `magic_apply` 메서드 구성을 조사하겠습니다.

명령 설명
std::expected 값과 오류를 모두 저장할 수 있는 기능이 있는 오류 처리를 위해 C++에서 사용되는 템플릿 유형입니다.
std::unexpected std::expected와 함께 사용하면 예상치 못한 오류 값을 나타냅니다.
template<typename...> 허용할 수 있는 무한한 양의 템플릿 인수를 사용하여 가변 템플릿의 개요를 설명합니다.
decltype 특히 표현식 유형을 알아내기 위해 템플릿 프로그래밍에 사용됩니다.
args.value() std::expected 객체에 값이 있으면 그 안에 포함된 값에 액세스합니다.
args.has_value() std::expected 객체에 값이 있는지 확인합니다.
(... && args.has_value()) 모든 std::expected 객체에 값이 있는지 확인하려면 표현식을 접습니다.
func(args.value()...) std::expected 객체의 값을 사용하여 func 메소드를 호출합니다.
return unexpected<Err>(args.error()...) std::expected 객체의 오류가 포함된 예기치 않은 오류를 반환합니다.

변수 템플릿을 사용한 효과적인 오류 관리

그만큼 type은 C++23에서 오류 처리를 쉽게 하기 위해 스크립트에서 사용됩니다. 주요 목표는 다음과 같은 일반 기능을 개발하는 것입니다. 여러 가지의 출력을 전송할 수 있는 다른 함수에 값을 부여합니다. 이렇게 하면 많은 사람들과 작업할 때 일반적으로 필요한 지루한 오류 검사가 수행됩니다. std::expected 값이 감소합니다. 여러 가지 작업이 필요할 수 있으므로 매우 유연합니다. 가변 템플릿을 활용하여 매개변수를 생성합니다. 어떤 내용으로든 함수를 호출하기 전에 객체의 기본 논리 magic_apply 접는 표현을 사용하고, , 모두 확인하기 위해 객체에 유효한 값이 있습니다.

이 아이디어는 다음과 같은 간단한 유형을 사용하는 첫 번째 스크립트 예제에 설명되어 있습니다. 그리고 . 이는 다음을 정의합니다. 기본적인 계산을 수행하는 함수 getA 그리고 반환하는 함수 유형. 두 값 모두에서 그리고 getB 합법적인 경우 전화를 걸 수 있습니다. 사용하여 ; 그렇지 않으면 오류가 전파됩니다. 상용구 코드를 줄임으로써 이 방법은 가독성과 유지 관리성을 향상시킵니다. 비슷한 아이디어가 두 번째 스크립트에 제시되어 있지만 접근 방식의 다양성을 강조하기 위해 유형과 lambda functions 사용됩니다.

`std::expected}를 사용하여 C++ 오류 처리의 복잡성 줄이기

Variadic 템플릿을 사용하는 C++23 스크립트

#include <expected>
#include <string>
#include <iostream>
#include <tuple>

using namespace std;

template<typename Func, typename... Args, typename Err>
auto magic_apply(Func func, const expected<Args, Err>&... args) -> expected<decltype(func(args.value()...)), Err> {
    if ((... && args.has_value())) {
        return func(args.value()...);
    } else {
        return unexpected<Err>(args.error()...);
    }
}

expected<int, string> getA(int x) {
    if (x > 0) return x;
    return unexpected<string>("Error in getA");
}

expected<double, string> getB(double y) {
    if (y > 0) return y;
    return unexpected<string>("Error in getB");
}

double compute_all(int a, double b) {
    return a + b;
}

int main() {
    auto result = magic_apply(compute_all, getA(10), getB(20.5));
    if (result) {
        cout << "Result: " << result.value() << endl;
    } else {
        cout << "Error: " << result.error() << endl;
    }
    return 0;
}

서로 다른 {std::expected} 결과 결합 C++23 값

Lambda 함수를 사용하는 C++23 스크립트

#include <expected>
#include <string>
#include <iostream>

using namespace std;

template<typename Func, typename... Args, typename Err>
auto magic_apply(Func func, const expected<Args, Err>&... args) -> expected<decltype(func(args.value()...)), Err> {
    bool all_valid = (args.has_value() && ...);
    if (all_valid) {
        return func(args.value()...);
    } else {
        return unexpected<Err>(args.error()...);
    }
}

expected<string, string> getA(bool flag) {
    if (flag) return "SuccessA";
    return unexpected<string>("Failed A");
}

expected<string, string> getB(bool flag) {
    if (flag) return "SuccessB";
    return unexpected<string>("Failed B");
}

string compute_all(const string& a, const string& b) {
    return a + " and " + b;
}

int main() {
    auto result = magic_apply(compute_all, getA(true), getB(true));
    if (result) {
        cout << "Result: " << result.value() << endl;
    } else {
        cout << "Error: " << result.error() << endl;
    }
    return 0;
}

Variadic 템플릿으로 C++ 오류 처리 개선

용량 복잡한 시스템에서 오류 처리를 크게 향상시키는 것은 C++에서 이를 사용하는 또 다른 중요한 이점입니다. 많은 비동기 작업의 결과를 원활하게 결합하는 것은 결과가 나오는 상황에서 필수적입니다. 유형. 이 방법은 코드를 더 단순하게 만드는 것 외에도 강력한 오류 처리를 보장합니다. 임의의 개수를 결합하여 보다 다양하고 일반적인 기능을 만들 수 있습니다. 가치 variadic templates.

다양성 다양한 인수 종류를 취하는 함수와 함께 사용할 수 있습니다. 구현은 다음을 활용하여 더욱 간단해집니다. , 결합된 함수 호출의 반환 유형을 자동으로 추론합니다. 또한 이 기술은 병합을 포함하여 보다 복잡한 작업을 관리하도록 확장될 수 있습니다. 다른 오류 종류의 값을 사용하거나 함수에 보내기 전에 값을 변경합니다. 적응성으로 인해 패턴은 간단한 계산부터 복잡한 작업까지 광범위한 작업에 사용할 수 있습니다.

Variadic 템플릿 및 std::expected에 대해 자주 묻는 질문

  1. 무엇인가요 ?
  2. 오류 또는 유효한 값을 보유할 수 있으며 오류 관리에 사용되는 C++ 템플릿 유형입니다.
  3. 어떻게 일하다?
  4. 수많은 결과를 결합하여 반복적인 오류 검사가 필요하지 않습니다. 값을 지정하고 함수에 전달합니다.
  5. 가변 템플릿이란 무엇입니까?
  6. 변수 템플릿은 함수가 임의 개수의 매개변수를 허용하도록 함으로써 함수 설계에 있어 상당한 자유를 제공합니다.
  7. 왜 사용합니까? ~에 ?
  8. 의 가치를 활용하여 호출되는 함수의 반환 유형을 자동으로 결정하는 개체입니다.
  9. ~이다 다양한 오류 유형을 처리할 수 있습니까?
  10. 예, 다음과 같이 작동하도록 만들 수 있습니다. 몇 가지 조정을 통해 다양한 오류 종류를 갖는 값입니다.
  11. 활용하면 어떤 이점이 있나요? 권하다?
  12. 실수를 처리할 때 예외나 반환 코드와 같은 기존 기술보다 더 표현적이고 깔끔한 접근 방식을 제공합니다.
  13. ~이다 ~의 일부 ?
  14. 게다가 , 실제로는 잘못된 값을 나타냅니다.
  15. 비동기 작업을 다음과 함께 활용할 수 있습니까? ?
  16. 실제로 처리에 적응할 수 있습니다. 비동기 작업에서 반환된 값입니다.
  17. 접기 표현이란 무엇입니까?
  18. 여기서는 C++의 접기 표현식이라는 기능을 사용하여 모든 항목이 있는지 확인합니다. 객체에는 간단한 방식으로 유효한 값이 포함됩니다.

C++23에서는 여러 std::expected 값을 처리하는 일반 함수를 구현하면 코드 가독성이 크게 향상되고 오류 처리가 크게 단순화됩니다. Magic_apply 함수는 가변 템플릿을 사용하여 처리 전에 모든 예상 값이 올바른지 확인함으로써 상용구 코드를 줄이고 유지 관리성을 향상시킵니다. 이 방법은 다양한 상황에 적용할 수 있는 유연한 솔루션을 제공하고 최신 C++ 프로그래밍에 오류를 처리하는 더 명확하고 효과적인 방법을 제공합니다.