【问题标题】:C++ generic container with linked list带有链表的 C++ 通用容器
【发布时间】:2011-04-05 14:06:10
【问题描述】:

我想设计一个通用容器以用于链接列表(例如)。 我尝试使用 void* 作为元素,但是当我提供以下内容时失败了。

list.insert(5);
list.insert("Hello");

如果我在堆上分配成员并传递它工作的地址,但我该如何处理上面示例中使用堆栈变量的情况?

【问题讨论】:

  • 你得到什么错误信息?
  • 我尝试使用 memcpy,但如果传递了文字,我没有要复制的地址。以及如何将变量返回,因为 void 不是 C 中的类型,它总是 void*
  • 我猜错误信息应该是“语法错误”,因为它被标记为 C,而 C 不支持成员函数。
  • 模板是否越界?即:List<int>List<char*>
  • @Lundin:上面的代码在 C 中是有效的语法,前提是 list 是一个结构实例,list.insert 是一个函数指针。

标签: c++ algorithm generics data-structures containers


【解决方案1】:

我个人会为此使用boost::any

【讨论】:

    【解决方案2】:

    ...可以简单地尝试重载插入函数...

    List::insert( int i ){}
    List::insert( char* i ){}

    等等……

    【讨论】:

    • 这适用于原语。通用对象呢?传入 void* 也需要一个大小值。
    • @Jeremy - 或完全模板化的插入 template<class T> List::insert(const T&);。至少它会知道sizeof(T)
    【解决方案3】:

    您需要以某种方式以字节为单位添加大小。

    int x = 5;
    insert (&x, sizeof(int));
    insert ("Hello", 6);
    

    等等

    插入方法可能如下所示:

    void insert (void* data, size_t size)
    {
      node_t node = malloc ...
    
      node.data = malloc ...
      node.size = size;
    
      memcpy(node.data, data, size);
    }
    

    【讨论】:

    • @Jeremy 哎呀,这确实是一个错误。谢谢,我会修改的。
    • 现在这突然被神奇地标记为 C++。那么更好的解决方案可能是使用模板,而不是 void*。
    【解决方案4】:

    如果你真的想要一个通用容器,你别无选择,只能创建一个包含标量值的虚拟对象(OMG-为什么我必须想到 java?)并插入它。您可以添加特殊的 insert_int, insert_char, ... 方法如何自行复制。这样你也不会遇到文字和堆栈变量的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多