gpt4 book ai didi

c++ - 可以报​​告失败原因的 std::optional 的替代方案

转载 作者:行者123 更新时间:2023-12-02 16:01:23 26 4
gpt4 key购买 nike

是否有 std::optional 的替代方案,我不必将 result 作为参数传递给函数。我希望函数不修改其参数(更纯粹/不可变)。

长话短说

std::optional 的问题似乎是我们丢失了有关错误的信息。该函数返回一个值或空值,因此您无法判断哪里出了问题。

使用 std::optional

std::optional<std::string> doSomething() {
std::string value;
int rc = callApi(value);

if (rc == 0) {
//do some processing on value
return value;
}

return std::nullopt;
}

//calling the function seems much more pure/cleaner than when passing a result parameter.

没有 std::optional

int doSomething(std::string& result) {
std::string value;
int rc = callApi(value);

if (rc == 0) { //if no error
//do some processing on value and set result = value
result = value;
}

return rc;
}

最佳答案

您要找的似乎是std::expected .

...它实际上并不在标准中,但是:

  • 您可以阅读提案的最新版本,P0323 revision 10
  • 你可以使用它!或者更确切地说,an implemented of it由才华横溢的 Sy Brand/TartanLlama 开发,包括一些不错的扩展,我不会详细介绍。

但是 - 它是什么?

好吧...简而言之:当您想要返回某个值或某种故障/错误描述符时,您只需将它们模板化,比如转换为 T、E,这些就是模板参数:std::expected<T, E> .由于 T 和 E 是不相交的类型,您知道从函数返回的是哪一个。

这是您的函数,适用于您的 API 似乎具有的错误类型:

namespace my_api {
using error_t = int;
enum : error_t { success = 0, invalid_input = 1, /* etc. */ };
} // namespace my_api

std::expected<std::string, my_api::error_t> doSomething() {
std::string value;
my_api::error_t rc = callApi(value);
if (rc != success) { return rc; }

//do some processing on value
return value;
}

当然是 my_api namespace 不是我建议的一部分,它只是一个例子,因为你没有说明你想如何传达错误。实际上,您甚至可以添加:

namespace my_api {
template <typename T>
using expected = std::expected<T, error_t>;
} // namespace my_api

然后你的函数签名变成:

my_api::expected<std::string> doSomething();

另请参阅:What is std::expected in C++?

关于c++ - 可以报​​告失败原因的 std::optional 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70570700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com