在调用此模板时,如何避免使用decltype



我有以下代码,用于自动捕获bad_variant_access错误。我知道我可以使用get_if来简化错误处理,但在这种特殊情况下,我不想要指针。这段代码看似有效,但却是多余的。正如你所看到的,我总是要做assert_no_bad_variant_access<decltype(v), int>(v, "msg");。我能以某种方式简化它以避免必须通过decltype(v)吗?对我来说似乎很冗长。

理想情况下,我希望有一个模板,我只需要将get_T传递给它。CCD_ 6应该以某种方式自动确定。

玩代码。

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

重新排列模板参数。设variant_T为第二个,由此可推导出

template <typename get_T, typename variant_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<std::string>(v, "std::string failed");
auto result2 = assert_no_bad_variant_access<int>(v, "int failed");
return 0;   
}

请记住,只有当后面的参数可以推导出来时,我们才能指定模板的部分参数。

顺便说一句,您不需要使用异常来检测这种情况。std::variantAPI包括std::holds_alternative。您可以直接查看。这将避免对常规控制流使用异常。

最新更新