【发布时间】:2020-07-24 18:38:02
【问题描述】:
我有以下代码,用于自动捕获bad_variant_access 错误。我知道我可以使用get_if 来简化错误处理,但在这种特殊情况下,我不需要指针。这段代码似乎可以工作,但是是多余的。如您所见,我总是要做assert_no_bad_variant_access<decltype(v), int>(v, "msg");。我可以以某种方式简化它以避免必须通过decltype(v)吗?对我来说似乎很罗嗦。
理想情况下,我想要一个模板,我只需要传递get_T。 variant_T 应该以某种方式自动确定。
template <typename variant_T, typename get_T>
get_T assert_no_bad_variant_access(variant_T& v, std::string_view msg) {
try {
return std::get<get_T>(v);
} catch (const std::bad_variant_access& bva) {
std::cout << msg << '\n';
get_T t;
return t;
}
}
int main()
{
std::variant<int, double, std::string> v = "hi there!";
auto result1 = assert_no_bad_variant_access<decltype(v), std::string>(v, "std::string failed");
auto result2 = assert_no_bad_variant_access<decltype(v), int>(v, "int failed");
return 0;
}
【问题讨论】:
-
我建议不要将其命名为
assert。人们不会期望一个失败的断言完全没问题。像<name>_or_default这样的东西更能说明函数的实际作用,尽管日志记录使这变得复杂。
标签: c++ templates exception variant decltype