设计自己的结果/两者之一:成功类型和错误类型是否总是目标?

我为c ++实现了Result / Either的实现。该课程的特色包括type-converting constructor

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());

现在事实证明,这样的构造函数过于宽容,并导致不良的类型转换。我想限制它。

所以问题是:  -您认为允许相同类型的Value结果和Error是否有用?例如: Result<MyTypeA,MyTypeA> r{};您是否有一个错误类型和成功类型相同且有用的示例?

此问题的动机是,我可以摆脱template 构造函数,但前提是V和E不是同一类型:

template<class V,class E>
struct Result {
    constexpr result(V&& value);    
    constexpr result(E&& value);
...
  • 此外,您认为仅使用r值构造函数在实践中就足够了吗? 我不认为Result 不是返回值-因此,没有任何理由不将值移出中间对象。
l635513504 回答:设计自己的结果/两者之一:成功类型和错误类型是否总是目标?

如果您是对称,则要隐式地从任一类型转换。如果传递给您的东西可以同时转换为两者,那么您将失败。

如果您是不对称的一种,就像结果一样,您希望隐式地从收藏类型转换。对于不利的类型,您只想进行显式转换。

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};
} 

应避免隐式转换为错误状态,这很容易意外访问。

本文链接:https://www.f2er.com/3152038.html

大家都在问