从空指针中推导一个类型
Deduce a type from a void pointer
考虑以下示例:
class MyContainer {
std::vector<void *> v;
public:
void Put(void *x) { v.push_back(x);}
void* Get(int index) { return v[index];}
};
void Work (MyContainer& c) {
// cast_to_type(c.Get(0));
}
int main() {
int x = 1;
double y = 2.0;
MyContainer c;
c.Put(&x);
c.Put(&y);
Work(c);
return 0;
}
假设函数Work
对向量指针指向的对象一无所知。还假设继承不是一个选项,并且指向的对象的类型可以是任意的(可以有无限数量的类型)。
是否可以仅使用MyContainer::Get
函数返回的void指针来推导类型?这可以使用强制转换、模板和typeid
运算符的任何组合来完成吗?
不,void*
绝对没有与它们相关的任何信息,当您将指针投射到void*
时,您将完全丢失类型。您必须找到另一种方法将不同类型存储在同一容器中,例如使用继承。
你也可以这样做:
class MyContainer {
struct cont {
void* ptr;
type_info* ti; // pointer, not reference, so this struct can be copied
};
std::vector<cont> v;
public:
template<typename T>
void Put(T* x) {
v.push_back({ x, &typeid(T) });
}
// do whatever you want with Get using *v[x].ti
};
int x = 1;
double y = 2.0;
MyContainer c;
c.Put(&x);
c.Put(&y);
Work(c);
但如果不知道自己在做什么,我不知道这会有多大帮助。你可能不得不求助于boost::any
这样更先进的东西。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 更改可变参数模板中的最后一个类型
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 有没有办法同时将一个类型分配给C++中的多个模板?
- C++:可以模板化一个类型名称吗
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 给定一个类型为 Container:<T>:Iterator 的函数参数,如何为某些类型的 T 实现特定的重载?
- 期望一个类型,得到一个模板
- 初始化一个类型向量的巨大向量<int>
- 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?
- 具有多种类型的类数组?如何访问数组中的一个类型
- Opencv C++ 声明一个类型为 uint8 的矩阵
- 模板参数列表中只有一个类型名称是什么意思?
- C++模板部分特化:为什么我无法匹配可变参数模板中的最后一个类型
- 为什么我们有一个类型不匹配
- 在函数模板中将一个类型名映射到另一个类型名
- 创建一个类型bool的向量,其中所有值均可初始化为true
- 在C API中定义了一个类型,如何将其与命名空间中的C++类相关联