如何获取多类型向量中的值(不添加 <type>)?
How do i get the value inside a multiple type vector (without adding the <type>)?
我创建了一个存储任何类型的值(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::function
或std::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
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 呼叫运营商<<临时
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么除非添加括号,否则构造函数上的模板替换会失败?