gpt4 book ai didi

c++ - 如何避免在调用此模板时必须使用decltype?

转载 作者:行者123 更新时间:2023-12-01 15:12:32 25 4
gpt4 key购买 nike

我有以下代码,用于自动捕获bad_variant_access错误。我知道我可以使用get_if简化错误处理,但是在这种特殊情况下,我不需要指针。该代码似乎有效,但是多余。如您所见,我始终必须执行assert_no_bad_variant_access<decltype(v), int>(v, "msg");。我可以以某种方式简化此操作,以避免必须通过decltype(v)吗?对我来说似乎罗word。
理想情况下,我希望有一个模板,只需要向其传递get_T即可。 variant_T应该以某种方式自动确定。
Play with the code.

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::variant API包括 std::holds_alternative 。您可以直接检查。这样可以避免将异常用于常规控制流。

关于c++ - 如何避免在调用此模板时必须使用decltype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63079631/

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