gpt4 book ai didi

c++ - 你能切换一个 std::any.type() 吗?

转载 作者:行者123 更新时间:2023-12-03 09:38:17 25 4
gpt4 key购买 nike

我想探索如何使用 std::any而不是 void * 或用于消息传递的此类构造。所以我创建了一个示例代码来测试这个——见下文。
std::any 的使用看起来不错,但我想切换类型以检查 std::any 是哪种类型。这可能是不可能的,而且我知道我可以使用 if/elseif... 块来代替,但是如果我可以创建一个 switch 语句,以便我在具有 10-20 种不同类型的实际代码中使用它,那就太好了它会更具可读性。

#include <string>  
#include <iostream>
#include <sstream>
#include <any>
#include <typeindex>

struct ints { int a{1}; int b{2}; };
struct strings { std::string a{"string1"}; std::string b{"string2"}; };

void send_msg(std::any item)
{
switch (item.type().hash_code()) // <------- HERE
{
case typeid(ints).hash_code(): // <------- HERE
std::cout << "ints" << std::endl;
break;
case typeid(strings).hash_code():
std::cout << "strings" << std::endl;
break;
default:
std::cout << "unknown type\n";
}
}

int main()
{
strings s;
send_msg(s);

ints i;
send_msg(i);
}

现场示例: https://godbolt.org/z/xPrMYM
我无法打开 std::any::type 返回的 type_info,但我可以打开 hash_code() type_info,但这不是我希望的 constexpr !
所以我还尝试获取类型信息的地址以及我能找到的其他一些技巧。但到目前为止没有运气......
有这样的方法吗?

最佳答案

你要问的是std::visit ,但与 std::any

template<typename... Ts, typename F>
bool visit(F&& f, std::any x)
{
auto result = ((x.type() == typeid(Ts) ?
(std::forward<F>(f)(*std::any_cast<Ts>(&x)), true) : false) || ...);
return result;
}
std::any可能包含任何内容, visit可能会在运行时失败,这就是为什么您当然需要某种方式来报告错误†。
用于
bool send_msg(std::any x)
{
auto f = [](auto&& x){
std::cout << x << '\n';
};
return visit<std::string, int>(f, x);
}
但是,使用 std::variant只是更简单
void send_msg(std::variant<std::string, int> x)
{
auto f = [](auto&& x){
std::cout << x << '\n';
};
visit(f, x);
}
†完整的 visit实现将是 bit more complicated .

关于c++ - 你能切换一个 std::any.type() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65291923/

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