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类的数据.这将为您处理所有构造/复制/销毁细节. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |