【发布时间】:2020-12-14 15:42:58
【问题描述】:
我想探索如何使用 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,但我可以打开 type_info 的 hash_code(),但这不是我希望的 constexpr!
所以我也尝试获取类型信息的地址以及我能找到的一些其他技巧。但到目前为止还没有运气......
有这样的方法吗?
【问题讨论】:
-
您可能正在寻找
std::variant和std::visit -
Variant 也破坏了正确的对象并且具有类型安全性。
-
@code_fodder 没错,但
any只是一个不受约束的variant,如果您切换类型表明您想要它是受约束的。 -
@code_fodder: "我读到它可以用来代替 void 之类的东西*" 它可以。如果您知道将其转换为正确的类型,您可以仅正确使用
void*。您不能使用void*“切换类型”,因此您尝试做的事情也不适用于void*。 -
@code_fodder:更重要的是,
any用于these circumstances