可以使用任何类型T调用Function1,它将被转换为(void*)以便能够添加到列表中但是我丢失了原始指针类型(我需要在一个链表中存储tham,因为我不能为每个创建一个可能的类型).所以我需要保存指针的类型.我知道无法使用c ++完成.有谁能建议替代解决方案?
class MyClass
{
template<class T>
void function1(T* arg1)
{
myList.add((void*)arg);
}
void function2()
{
for(int i = 0; i < myList.size(); i++)
{
myList.get(i);
//restore the original pointer type
}
}
STLinkedlist<void*> myList;
}
Run Code Online (Sandbox Code Playgroud)
处理这类问题的常用方法是使用公共接口,在C++中这是通过继承来完成的.这可能是拖累,特别是在受限情况下,完整的类/接口层次结构将提供过多的代码/运行时开销.
在Boost.Variant中,它允许您使用相同的对象来存储不同的类型.如果您需要更多自由,请使用Boost.Any.有关比较,请参见此处.
在一天结束时(或者更好:比较晚),我会尝试以不同的方式做事,这样你就不会遇到这个问题.最终它可能是值得的.
如果你通过无效*丢失了类型信息,它就消失了.你不能只是恢复它.
因此,您必须将额外信息与指针一起存储,然后使用分支代码将其强制转换,或者更确切地说驱动设计以避免丢失.
你的情况非常可疑,你不是你真正想要的.
更常见的情况是您需要多态集合.这不会存储任何类型的指针,而是存储属于同一层次结构的指针.Collection有Base*指针,你可以通过Base的界面使用对象,所有这些都调用正确的虚函数而无需程序员的交互.如果你真的需要转换为原始类型,你可以通过dynamic_cast安全地进行.或者在基本界面中添加一些类型信息支持.