gpt4 book ai didi

c++ - 使用可能抛出的表达式初始化 const 变量的推荐方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:26 25 4
gpt4 key购买 nike

您可能知道这样的情况,您只想将一个 (const) 变量赋值给一个可能会失败(抛出)的表达式(例如 container.at()) 这会迫使您编写样板代码:

void foo(const string &key) {
auto it = data_store.find(key);
if (it == data_store.end()) {
return;
}
const auto & element = it->second;
...
go on with `element`...
...
}

在 Python 中你可以这样写代码:

def foo(name):
try:
element = data_store[key]
except KeyError:
return
..
go on with `element`
..

.. with 噪音较小,因为您不会为了检查是否存在而引入无用的额外 it

如果 C++ 的 try 不会引入变量作用域,您可以只使用 at():

void foo(const string &key) {
try {
const auto & element = data_store.at(key);
} catch (const out_of_range &) {
return;
}
...
go on with `element`...
...
}

如果您不想放弃constness 并保持代码整洁,那么去这里的方法是什么?

如果 lambda 只能有一个 try/catch 主体你可以写

void foo(const string &key) {
const auto & element = [&] () -> T try {
return data_store.at(key);
} catch () {
return;
} ();
...
go on with `element`...
...
}

类似问题的一些答案建议使用 try/catch block 围绕所有代码:

void foo(const string &key) {
try {
const auto & element = data_store.at(key);
...
go on with `element`...
...
} catch (const out_of_range &) {
return;
} catch (some other exception) {
...
} catch (some other exception) {
...
}
}

但我不喜欢这样,原因有以下三个:

  • at() 和它的 catch block 之间没有视觉关联
  • 可能有些代码还需要您处理out_of_range
  • 你必须编写嵌套代码

您知道哪些(漂亮、简短和干净的)替代品?

最佳答案

this thread 上有三个不错的选择,真的没有其他选择。

这些情况假设我们正在初始化一个对象;要按原样初始化引用,请将这些技术应用于 std::reference_wrapper 或指针。


顺便说一句,我不会这么快打折您的第一个代码示例。它比所有其他选项都简单,而且 C++ 中的一个常见建议是仅在异常情况下使用异常——您不希望它们成为函数契约的正常部分。将它们用作快捷方式不是惯用的。

换句话说,如果函数设计是在查找失败时什么都不做,那么抛出捕获对于函数来说是一个不必要的复杂化。您刚刚编写了一个更丑陋的 C 风格错误处理版本。

at() 访问器的全部要点是您的函数可以通过 捕获保持简单——异常可以被传播到更多通用错误处理程序。

关于c++ - 使用可能抛出的表达式初始化 const 变量的推荐方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51650344/

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