Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在链表c+;中为未知返回类型使用空指针+;_C++_Linked List_Void Pointers - Fatal编程技术网

C++ 在链表c+;中为未知返回类型使用空指针+;

C++ 在链表c+;中为未知返回类型使用空指针+;,c++,linked-list,void-pointers,C++,Linked List,Void Pointers,我正在尝试实现一个链表,每个节点持有的值不一定总是相同的类型。我使用了一个空指针来存储该值,但我遇到的问题是从节点检索该值。我想编写一个包含switch语句的函数,将值强制转换为适当的类型,但除了使用另一个void指针之外,我不确定如何处理未知的返回类型 有没有办法解决这个问题,或者有没有更有效的方法来处理未知的数据类型 除非100%确定自己在做什么,否则不要使用void* 对于值 你根本不使用原始指针,但是从C++标准库的设施中使用适当的习惯用法。 您使用标准的链表实现: “有没有办法解决这个

我正在尝试实现一个链表,每个节点持有的值不一定总是相同的类型。我使用了一个空指针来存储该值,但我遇到的问题是从节点检索该值。我想编写一个包含switch语句的函数,将值强制转换为适当的类型,但除了使用另一个void指针之外,我不确定如何处理未知的返回类型

有没有办法解决这个问题,或者有没有更有效的方法来处理未知的数据类型

  • 除非100%确定自己在做什么,否则不要使用
    void*
  • 对于
  • <>你根本不使用原始指针,但是从C++标准库的设施中使用适当的习惯用法。
  • 您使用标准的链表实现:
  • “有没有办法解决这个问题,或者有没有更有效的方法来处理未知的数据类型?”


    <>是的,有< <代码> Boo::任何或Boo::变体< /C> >,尽管这些不是C++标准类型。

    < P>如果您存储的指针都是您创建的类,可以创建公共基类吗?然后,您只需要有一个指向基类类型的指针的链接列表


    当您需要从基类指针检索派生指针时,您可以尝试一系列的
    if(dynamic_cast(ptr)!=nullptr)
    测试,直到其中一个测试通过——那么您就知道您找到了正确的类型。

    即使函数位于另一个模块而不是客户端函数中,您也可以这样做。我已经回答了一个类似的问题。但是void指针的一个可能问题是,您必须跟踪所有类型,并用switch语句验证它们中的每一个,正如您所说。我分享了大量这样做的代码。希望你喜欢

    如果它可以是你提前知道的几种类型中的一种,那就试试工会。不要使用
    get()
    函数,而是使用
    getInt()
    getString()
    等,或者使用模板化的
    get()
    。更好的是,如果您可以使用Boost,请尝试
    Boost::variant
    Boost::any
    std::list
    ?我想补充一点,除非您知道自己真正需要的是链表(std::list),否则永远不要使用链表。默认情况下使用std::vector,除非您知道需要其他东西。