如何保存指针c ++的类型

Dal*_*eme 0 c++ pointers

可以使用任何类型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)

rub*_*nvb 7

处理这类问题的常用方法是使用公共接口,在C++中这是通过继承来完成的.这可能是拖累,特别是在受限情况下,完整的类/接口层次结构将提供过多的代码/运行时开销.

Boost.Variant中,它允许您使用相同的对象来存储不同的类型.如果您需要更多自由,请使用Boost.Any.有关比较,请参见此处.

在一天结束时(或者更好:比较晚),我会尝试以不同的方式做事,这样你就不会遇到这个问题.最终它可能是值得的.

  • 我只会注意到,你在存储中获得的"自由"越多,之后使用的自由就越少. (4认同)

Bal*_*Pal 6

如果你通过无效*丢失了类型信息,它就消失了.你不能只是恢复它.

因此,您必须将额外信息与指针一起存储,然后使用分支代码将其强制转换,或者更确切地说驱动设计以避免丢失.

你的情况非常可疑,你不是你真正想要的.

更常见的情况是您需要多态集合.这不会存储任何类型的指针,而是存储属于同一层次结构的指针.Collection有Base*指针,你可以通过Base的界面使用对象,所有这些都调用正确的虚函数而无需程序员的交互.如果你真的需要转换为原始类型,你可以通过dynamic_cast安全地进行.或者在基本界面中添加一些类型信息支持.