C通用数据类型

C通用数据类型,第1张

概述我有一个通用数据类型,它通过值传递,但不维护类型信息.我们只存储指针和基本数据类型(如int,float等).现在我们第一次需要在其中存储std :: string.所以我们决定将它转换为std :: string *并存储它.然后是破坏问题.我们不喜欢每次都复制std :: string.所以我在考虑这样的方法.假设数据类型如下所示 class Atom{public : enum 我有一个通用数据类型,它通过值传递,但不维护类型信息.我们只存储指针和基本数据类型(如int,float等).现在我们第一次需要在其中存储std :: string.所以我们决定将它转换为std :: string *并存储它.然后是破坏问题.我们不喜欢每次都复制std :: string.所以我在考虑这样的方法.假设数据类型如下所示

@H_419_8@

@H_419_8@

class Atom{public :     enum flags     {         IS_STRING,IS_EMPTY,HAS_GOT_copIED,MARKER     };private:     voID*   m_value;     std::bitset<MARKER>   m_flags;public:    .....    Atom( Atom& atm )    {        atm.m_flags.set( HAS_GOT_copIED );        .....     }    .....    ~Atom()    {        if( m_flags.test(IS_STRING) && !m_flags.test(HAS_GOT_copIED) )        {             std::string*  val = static_cast<std::string*>(m_value);             delete val;        }    }};

这是一个很好的方法来找出是否没有更多的std :: string *引用?任何意见..@H_419_8@

我看过boost :: any和poco :: DynamicAny.由于我需要序列化,我不能使用它们.@H_419_8@

谢谢,
戈库尔.@H_419_8@解决方法 这种方法的一个主要缺陷是你真的需要一个引用计数,而不是一个单独的“已被复制”标志.如果您多次复制字符串,该位将不起作用.如上所述,如果您创建Atom的副本并在原始副本之前删除副本,则会遇到麻烦:

@H_419_8@

@H_419_8@

Atom a("hello world");if (...) {    Atom b(a);    // b is destroyed,deleting the string}// Uh oh,the string's been deleted but a is still referencing it.cout << (string) a;

我不会重新发明轮子.如果boost :: any不能正常工作,你仍然可以在内部使用它代替m_value字段来存储Atom类的数据.这将为您处理所有构造/复制/销毁细节.@H_419_8@ 总结

以上是内存溢出为你收集整理的C通用数据类型全部内容,希望文章能够帮你解决C通用数据类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1221809.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存