在C++中,如果你想存储多种类型的结构成员指针,可以使用std::variant
或std::any
。这两种方法都允许你在同一个容器中存储不同类型的值。
std::variant
std::variant
是C++17引入的一个类型安全的联合体(union)。它可以存储固定集合中的任何一种类型。
#include <iostream>
#include <variant>
struct Foo {
int x;
};
struct Bar {
double y;
};
int main() {
std::variant<Foo*, Bar*> v;
Foo foo = {42};
Bar bar = {3.14};
v = &foo; // 存储Foo*类型的指针
std::cout << "Foo: " << std::get<Foo*>(v)->x << std::endl;
v = &bar; // 存储Bar*类型的指针
std::cout << "Bar: " << std::get<Bar*>(v)->y << std::endl;
return 0;
}
std::any
std::any
是C++17引入的另一个类型,它可以存储任何类型的值。与std::variant
不同,std::any
没有固定的类型集合。
#include <iostream>
#include <any>
struct Foo {
int x;
};
struct Bar {
double y;
};
int main() {
std::any a;
Foo foo = {42};
Bar bar = {3.14};
a = &foo; // 存储Foo*类型的指针
std::cout << "Foo: " << std::any_cast<Foo*>(&a)->x << std::endl;
a = &bar; // 存储Bar*类型的指针
std::cout << "Bar: " << std::any_cast<Bar*>(&a)->y << std::endl;
return 0;
}
std::variant
和std::any
时,需要注意类型安全。错误的类型转换可能会导致运行时错误。std::get
和std::any_cast
时要确保类型匹配,否则会抛出异常。std::variant
和std::any
可能会引入一些额外的开销,特别是在存储和检索值时。std::variant
和std::any
可能会使代码更复杂,增加维护难度。通过这些方法,你可以有效地存储和处理多种类型的结构成员指针。
领取专属 10元无门槛券
手把手带您无忧上云