有没有人知道我可以在我的程序中使用的TR1 shared_ptr
(以及其他智能指针)的开源独立实现?
“shared_ptr
的独立实施意味着 shared_ptr
本身需要独立。
不仅仅是包含库。
所以请没有提升!
答案 0 :(得分:5)
shared_ptr
的boost实现完全是仅限标头的,因此安装boost以使用它就像下载boost并将其添加到编译器的头搜索路径一样简单。与其他任何独立实现相比,这并没有比增强更难。如果您只想提取shared_ptr
组件以进行单独分发,则可以使用Boost BCP。
答案 1 :(得分:5)
你可以很容易地破解wxWidgets中的sharedptr.h头来删除一些宏依赖(assert,“explicit”关键字等)。然后,您需要替换或删除内部引用计数变量的原子inc / dec。重命名模板并将其粘贴到命名空间中。然后你将拥有shared_ptr的单文件独立版本。
这样做的好处是,您正在修改的源具有广泛的用途和同行评审。
答案 2 :(得分:3)
您可以使用Boost BCP从Boost中提取组件。
答案 3 :(得分:2)
嗯,我猜我自己创造的东西可能比shared_ptr
更好:
template<typename T>
class auto_
{
T *pValue;
mutable const auto_<T> *pPrev, *pNext;
public:
auto_() : pValue(new T()), pPrev(NULL), pNext(NULL) { }
auto_(T *pValue) : pValue(pValue), pPrev(NULL), pNext(NULL) { }
auto_(const T &v) : pValue(new T(v)), pPrev(NULL), pNext(NULL) { }
auto_(const auto_<T> &o) : pValue(o.pValue), pPrev(&o), pNext(NULL)
{ o.pNext = this; }
virtual ~auto_()
{
const auto_<T> *const pPrev = this->pPrev, *const pNext = this->pNext;
if (pPrev != NULL) { pPrev->pNext = pNext; }
if (pNext != NULL) { pNext->pPrev = pPrev; }
if (pPrev == NULL && pNext == NULL) { delete this->pValue; }
this->pPrev = this->pNext = NULL;
this->pValue = NULL;
}
auto_<T>& operator=(const auto_<T>& other)
{
if (this != &other)
{
this->~auto_();
this->pValue = other.pValue;
this->pPrev = &other;
this->pNext = other.pNext;
if (other.pNext != NULL) { other.pNext->pPrev = this; }
other.pNext = this;
}
return *this;
}
operator T&() { return *this->pValue; }
operator T*() { return this->pValue; }
T* operator->() { return this->pValue; }
T& operator *() { return *this->pValue; }
operator const T&() const { return *this->pValue; }
operator const T*() const { return this->pValue; }
const T* operator->() const { return this->pValue; }
const T& operator *() const { return *this->pValue; }
};
样本用法:
template<typename T>
T recurse(T value, int depth)
{
if (depth > 0) { T result = recurse(value, depth - 1); return result; }
else { return value; }
}
auto_<int> test()
{
printf("Value: %d\n", *recurse(auto_<int>(10), 3));
auto_<int> p1 = recurse<auto_<int> >(5, 3);
printf("Value: %d\n", *p1);
auto_<int> p2 = 3;
p1 = p2;
p2 = p1;
return p2;
}
使用起来比shared_ptr
,恕我直言。
是否有任何我错过的陷阱(除了显而易见的线程 - 不安全)?
任何(建设性的)批评都赞赏。
答案 4 :(得分:2)
我一直在寻找这样的事情 - 就像你一样,我有一个项目,其中包括大量的Boost是完全不可接受的。
我发现了这个:
http://www.lri.fr/~marc/EO/eo/doc/html/shared__ptr_8h-source.html
我不知道代码质量,因为它是GPL2,这意味着我不能在我的专有代码中使用它,但它似乎没有依赖性。但它确实似乎是你问题的答案。