加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C通用数据类型

发布时间:2020-12-16 10:39:29 所属栏目:百科 来源:网络整理
导读:我有一个通用数据类型,它通过值传递,但不维护类型信息.我们只存储指针和基本数据类型(如int,float等).现在我们第一次需要在其中存储std :: string.所以我们决定将它转换为std :: string *并存储它.然后是破坏问题.我们不喜欢每次都复制std :: string.所以我
我有一个通用数据类型,它通过值传递,但不维护类型信息.我们只存储指针和基本数据类型(如int,float等).现在我们第一次需要在其中存储std :: string.所以我们决定将它转换为std :: string *并存储它.然后是破坏问题.我们不喜欢每次都复制std :: string.所以我在考虑这样的方法.假设数据类型如下所示

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 *引用?任何意见..

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

谢谢,
戈库尔.

解决方法

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

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类的数据.这将为您处理所有构造/复制/销毁细节.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读