gpt4 book ai didi

c++ - 从 void 指针推导出类型

转载 作者:太空狗 更新时间:2023-10-29 20:00:00 25 4
gpt4 key购买 nike

考虑以下示例:

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 对 vector 指针指向的对象一无所知。还假设继承不是一种选择,并且指向对象的类型可以是任意的(可以有无限多种类型)。

是否可以仅使用 MyContainer::Get 函数返回的空指针来推断类型?这可以使用强制转换、模板和 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

关于c++ - 从 void 指针推导出类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9509972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com