GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
my_unexpected.h
[詳解]
1
3
4// Copyright(c) 2023-2025 Design Engineering Laboratory, Saitama University
5// Released under the MIT license
6// https://opensource.org/licenses/mit-license.php
7
8#ifndef DESIGNLAB_UNEXPECTED_H_
9#define DESIGNLAB_UNEXPECTED_H_
10
11#include <initializer_list>
12#include <stdexcept>
13#include <type_traits>
14#include <utility>
15
16namespace designlab::nostd {
17
18template <typename E>
19class unexpected final {
20 public:
21 // テンプレートパラメータ制約
22
23 template <typename Err>
24 static constexpr bool param_concept3_1 =
25 !std::is_same_v<std::remove_cvref_t<Err>, unexpected>;
26
27 template <typename Err>
28 static constexpr bool param_concept3_2 =
29 !std::is_same_v<std::remove_cvref_t<Err>, std::in_place_t>;
30
31 template <typename Err>
32 static constexpr bool param_concept3_3 = std::is_constructible_v<E, Err>;
33
34 template <typename Err>
35 static constexpr bool param_concept3 =
36 param_concept3_1<Err> && param_concept3_2<Err> && param_concept3_3<Err>;
37
38 template <typename... Args>
39 static constexpr bool param_concept4 = std::is_constructible_v<E, Args...>;
40
41 template <typename U, typename... Args>
42 static constexpr bool param_concept5 =
43 std::is_constructible_v<E, std::initializer_list<U>, Args...>;
44
45 // コンストラクタ
46
47 constexpr unexpected(const unexpected&) = default;
48 constexpr unexpected(unexpected&&) = default;
49
50 template <typename Err = E,
51 std::enable_if_t<param_concept3<Err>, std::nullptr_t> = nullptr>
52 constexpr explicit unexpected(const Err& e) : error_(e) {}
53
54 template <typename... Args,
55 std::enable_if_t<param_concept4<Args...>, std::nullptr_t> = nullptr>
56 constexpr explicit unexpected(std::in_place_t, Args&&... args)
57 : error_(std::forward<Args>(args)...) {}
58
59 template <
60 typename U, typename... Args,
61 std::enable_if_t<param_concept5<U, Args...>, std::nullptr_t> = nullptr>
62 constexpr explicit unexpected(std::in_place_t, std::initializer_list<U> il,
63 Args&&... args)
64 : error_(il, std::forward<Args>(args)...) {}
65
66 constexpr unexpected& operator=(const unexpected&) = default;
67 constexpr unexpected& operator=(unexpected&&) = default;
68
69 constexpr ~unexpected() = default;
70
71 // 比較演算子(friend関数で定義)
72 template <typename E2>
73 friend constexpr bool operator==(const unexpected<E2>& lhs,
74 const unexpected<E2>& rhs);
75 template <typename E2>
76 friend constexpr bool operator!=(const unexpected<E2>& lhs,
77 const unexpected<E2>& rhs);
78
79 constexpr const E& error() const& noexcept { return error_; }
80 constexpr E& error() & noexcept { return error_; }
81 constexpr E&& error() && noexcept { return std::move(error_); }
82
83 private:
84 E error_;
85};
86
87// ヘルパー関数(推論支援)
88template <typename E>
90 return unexpected<std::decay_t<E>>(std::forward<E>(e));
91}
92
93// 型推論のためのエイリアス
94template <class E>
96
97template <typename E>
98constexpr bool operator==(const unexpected<E>& lhs, const unexpected<E>& rhs) {
99 return lhs.error() == rhs.error();
100}
101
102template <typename E>
103constexpr bool operator!=(const unexpected<E>& lhs, const unexpected<E>& rhs) {
104 return !(lhs == rhs);
105}
106
107// constexprでのテスト
108static_assert(unexpected<int>{0}.error() == 0,
109 "unexpected<int>のerror()が正しく動作しません。");
110
111static_assert(unexpected<std::string>{"error"}.error() == "error",
112 "unexpected<std::string>のerror()が正しく動作しません。");
113
114} // namespace designlab::nostd
115
116#endif // DESIGNLAB_UNEXPECTED_H_
constexpr ~unexpected()=default
constexpr unexpected & operator=(unexpected &&)=default
friend constexpr bool operator!=(const unexpected< E2 > &lhs, const unexpected< E2 > &rhs)
friend constexpr bool operator==(const unexpected< E2 > &lhs, const unexpected< E2 > &rhs)
constexpr unexpected & operator=(const unexpected &)=default
static constexpr bool param_concept5
constexpr unexpected(unexpected &&)=default
ムーブコンストラクタ
static constexpr bool param_concept3_2
constexpr E & error() &noexcept
constexpr unexpected(const Err &e)
static constexpr bool param_concept3_1
constexpr const E & error() const &noexcept
constexpr unexpected(const unexpected &)=default
コピーコンストラクタ
static constexpr bool param_concept3_3
static constexpr bool param_concept3
static constexpr bool param_concept4
constexpr unexpected(std::in_place_t, Args &&... args)
constexpr E && error() &&noexcept
constexpr unexpected(std::in_place_t, std::initializer_list< U > il, Args &&... args)
constexpr unexpected< std::decay_t< E > > make_unexpected(E &&e)
constexpr bool operator==(const unexpected< E > &lhs, const unexpected< E > &rhs)
constexpr bool operator!=(const unexpected< E > &lhs, const unexpected< E > &rhs)
Definition com_type.h:21