gpt4 book ai didi

c++ - 如何在编译时捕获 std::variant 持有错误的类型?

转载 作者:行者123 更新时间:2023-12-04 14:50:58 26 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>
#include <string>
#include <map>
#include <variant>

using namespace std;

template <class... Ts>
struct overloaded : Ts...
{
using Ts::operator()...;
};
template <class... Ts>
overloaded(Ts...)->overloaded<Ts...>;

using element_dict = std::map<string, string>;
using element_type = std::variant<string, element_dict, int>;

void foo(element_type elements)
{
std::visit(overloaded{
[](string element) { cout << "string\n"; },
[](element_dict element) { cout << "dict\n";},
[](auto /*elements*/) { throw std::runtime_error("wrong type"); }
}, elements);
}

int main()
{
element_type str_elems = "string_elem";
foo(str_elems);
element_type dict_elems = element_dict{ {"string", "string"} };
foo(dict_elems);
element_type wrong_type_elems = 5;
foo(wrong_type_elems); // throws error

return 0;
}

标准输出:

string
dict
libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: wrong type

我有包含多种类型的 element_type。基本上我认为它包含 stringelement_dict。我遇到这样的情况,有人将 int 类型添加到 element_type,但忘记为 foo 函数提供所需的修复。现在我在运行时抛出异常时检测到这种情况。有什么方法可以在编译时检测到它吗?

最佳答案

让这种情况在编译时失败的最简单方法是简单地不包括捕获非 string 和非 element_dict 类型项目的重载 lambda;即去掉

[](auto /*elements*/) { throw std::runtime_error("wrong type"); }

然后它将在编译时失败。基本上,通过包含该案例,您是在明确告诉编译器您希望它成功编译此类案例;您正在选择加入您不想要的行为。

关于c++ - 如何在编译时捕获 std::variant 持有错误的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69121575/

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