CHATGPT O3 给出了答案:
struct Command {
std::string_view key;
void (*logic)(int32_t);
};
void run_all(std::string_view src, std::span<const Command> cmds)
{
for (auto [k, func] : cmds) {
try {
int32_t v = parse(src, k); // 抛异常版本
func(v);
} catch (const parse_error&) {
// 忽略缺失或非法
}
}
}
int main() {
constexpr Command table[] = {
{"b", performBlogic},
{"d", performDlogic},
{"a", performAlogic}
};
run_all("a=1;b=2;c=3", table);
}
下面是原帖:
=====================
解析字符串,无异常版:
bool parse(std::string_view str, std::string_view key, int32_t & value)
{
// 解析成功与否通过返回值返回, 结果通过 value 返回。
}
int main()
{
int32_t value = 0; // 默认值为 0, 如果要解析的key不存在,或者解析后转换为 value 失败,返回 false, 则不执行这个值的逻辑
if (parse("a=1;b=2;c=3", "b", value))
{
performBlogic(value);
}
if (parse("a=1;b=2;c=3", "d", value))
{
performDlogic(value);
}
if (parse("a=1;b=2;c=3", "a", value))
{
performAlogic(value);
}
return 0;
}
上述代码中,某个值不存在或者非法不影响应用其他值的逻辑。
如果用异常版本的 parse, 它抛出异常捕获后,怎么去继续应用其他值的 logic? 每次调用都写一个 try catch 那样会很笨拙,用异常能有比判断返回值更优雅的方式吗?
--
修改:speedboy2998 FROM 218.76.62.*
FROM 218.76.62.*