如何获取多类型向量中的值(不添加 <type>)?

How do i get the value inside a multiple type vector (without adding the <type>)?

本文关键字:添加 lt type gt 获取 何获取 多类型 向量      更新时间:2023-10-16

我创建了一个存储任何类型的值(int,bool,string,&,object,...)的向量。我可以存储东西,但我不知道如何获取特定元素([索引])。编辑:(不添加类型)

我没有尝试过很多事情,因为我没有头绪。我能想到的唯一技术是dynamic_cast,但既然是模板就没有意义了。

#include <vector>
#include <iostream>
struct slot {
virtual void print() = 0;
};
template<typename kind>
struct item : public slot {
kind value;
item(kind value) : value{ value } {};
void print()override { std::cout << value<<std::endl; }
};

class Bag {
std::vector<slot*> backpack;
public:
template<typename kind>
void append(kind stuff) {
backpack.push_back(new item<kind>(stuff));
}
void print_to_test() {
for (slot* it : backpack) { it->print(); }
}
//kind get()...How do i get an item value?
};
Bag bag;
bag.append(1);
bag.append(true);
bag.append("Hola");
bag.append(1232131);
void* a = nullptr;
bag.append(a);
bag.print_to_test();
//works fine, prints everything
//but can't get an specific value, like bag[index]

动态演员表将起作用。请注意,它至少需要一个虚拟方法 - 如果没有其他方法,可以使用析构函数。 是的,没有办法可靠地检索值。C++没有像其他语言那样的一般object基础,也没有任何有用的运行时反射。 您实现的内容称为类型擦除,实际上用于例如std::functionstd::any.

不应使用原始指针和new作为所有权。请改用std::unique_ptr。此外,由于您仅通过基类引用对象,因此需要虚拟析构函数。否则,您将无法正确delete它们,这也是std::unique_ptr的另一个原因,因为它会自行删除指针。

如果你想得到这个值,你会用它做什么?引用Bjarne Stroustrup的话:

没有有用的通用类:真正的通用类不带有自己的语义。

是的,您可以将此值存储在std::any中,但仅此而已,您想用它做什么?打印出来?好吧,在这种情况下,它不再是any而是像您的示例一样printable,因此请使用模板或虚拟方法在存储对象的类型中表达这些特征。

请考虑对已知的一组可能类型使用std::variant,并且更喜欢std::any而不是拥有void*。如果您需要后者,请先重新考虑您的设计选择。

正如其他人指出的那样,dynamic_cast工作正常(只要调用者知道特定索引中的类型):

item<int>& someInt = dynamic_cast<item<int>&>(*bag.backpack[0]);
std::cout << "someInt: ";
someInt.print();

注意:您没有提供背包成员的访问器,所以我假设它是公开的

输出:

一些国际: 1