c++ - 设计自己的结果/要么:成功类型和错误类型是否应该始终是明确的?
问题描述
我有一个Result
/Either
用于 c++ 的实现。该类具有以下类型转换构造函数:
template <typename V, typename E>
class Result {
...
template<typename X>
constexpr Result(X&& value);
...
};
这样做的目的是启用如下代码:
Result<SomeType, int> value = SomeType{...};
EXPECT_TRUE(result.isOk()); // TRUE
// Also
Result<SomeType, int> value = 10;
EXPECT_TRUE(result.isError()); // TRUE
这对于函数返回值很重要:
Result<SuccessType, int> func() {
SuccessType result{...};
...
return result;
}
...
EXPECT_TRUE(func().isOk());
现在事实证明,这样的构造函数过于宽松并导致不希望的类型转换。我想限制它。
所以问题是: - 你认为允许相同类型的值结果和错误有用吗?例如:
Result<MyTypeA, MyTypeA> r{};
你有没有错误类型和成功类型相同并且有用的例子?
这个问题的动机是我可以摆脱 template<> 构造函数,但前提是 V 和 E 不是相同的类型:
template<class V, class E>
struct Result {
constexpr result(V&& value);
constexpr result(E&& value);
...
- 另外,你认为在实践中只有 r 值的构造函数就足够了吗?我想不出 Result<> 不是返回值——因此不将值移出中间对象是没有意义的。
解决方案
如果您是对称的,您想隐式地从任一类型转换。如果您通过了可以转换为两者的东西,那么您希望失败。
如果您也是不对称的,就像结果一样,您希望从喜欢的类型隐式转换。从不受欢迎的类型中,您只想显式转换。
template<class X>
struct Error {
X x;
};
template<class V, class E>
struct Result {
Result( V&& v );
Result( Error<E> e );
// or even:
template<class O,
std::enable_if_t< std::is_convertible_v<O, E>, bool > = true
>
Result( Error<O> e );
};
使用看起来像:
Result<SomeType, int> value = SomeType{...};
EXPECT_TRUE(result.isOk()); // TRUE
// Also
Result<SomeType, int> value = Error{10};
EXPECT_TRUE(result.isError()); // TRUE
和:
Result<SuccessType, int> func() {
SuccessType result{...};
...
return result;
}
有效,如下所示:
Result<SuccessType, int> func() {
return Error{10};
}
应避免隐式转换为错误状态,因为它太容易意外访问。
推荐阅读
- node.js - Node: Generate 6 digits random number using crypto.randomBytes
- javascript - How to remove `&` sign and all text after that from url
- ubuntu - Disable user interactions for a specific screen on Linux
- android - Firestore Android Join Collections
- vba - VBA - 在 a 范围内加 1 小时
- sql - System Error &h80040e14 when running Stored Procedure from VBA to Stored Proc on server
- database - Applications similar to Oracle Forms
- python-3.x - 如何删除嵌套在列表中的字符?
- java - java.lang.OutOfMemoryError:超过 GC 开销限制”,同时使用 apache POI 读取 excel 文件
- c# - 没有数据的 WebAPI POST 导致应用程序崩溃