3 Ekim 2017 Salı

smart_ptr shared_ptr Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/shared_ptr.hpp>
Constructor - array
Açıklaması şöyle
boost::make_shared etc. support array types - either one of unknown size, or one of fixed size
Şöyle yaparız.
boost::shared_ptr<int[]> p = boost::make_shared<int[]>(30); *(1)
boost::shared_ptr<int[30]> p1 = boost::make_shared<int[30]>(); *(2)
Şöyle yaparız.
int arr_size = 30;
boost::shared_ptr<int[]> p = boost::make_shared<int[]>(arr_size);
Eğer array büyüklüğünü belirten *(2) yöntemini kullanırsak operator [] bounds check yapmaya başlar. Açıklaması şöyle
Starting with Boost release 1.53, shared_ptr can be used to hold a pointer to a dynamically allocated array. This is accomplished by using an array type (T[] or T[N]) as the template parameter. There is almost no difference between using an unsized array, T[], and a sized array, T[N]; the latter just enables operator[] to perform a range check on the index.
Constructor - type
Şöyle yaparız.
boost::shared_ptr<A> p ( boost::make_shared<A>() );
operator = metodu
Şöyle yaparız
namespace pcl {
  struct PointXYZ {};
  template <typename P> struct PointCloud {
  };
}


using pc = pcl::PointCloud<pcl::PointXYZ>;
boost::shared_ptr<pc> p             = boost::make_shared<pc>();
boost::shared_ptr<const pc> const_p = boost::make_shared<pc>();

// This is legal
const_p = p;
use_count metodu
Şöyle yaparız.
boost::shared_ptr<int> p1{new int{1}};
std::cout << *p1 << '\n'; //1
std::cout << "--> " << p1.use_count() << "\n"; //1
boost::shared_ptr<int> p2{p1};
std::cout << "--> " << p1.use_count() << " : " << p2.use_count() << "\n"; //2:2

Diğer
boost::shared_ptr ve std::shared_ptr Dönüşümü
boost::shared_ptr ve std::shared_ptr farklı sınıflar. Birini değerine dönüştürmek için şöyle yaparız. Burada constructor içine verilen lamnda capture by value yaptığı için std::shared_ptr veya boost:::shared_ptr'nin reference count değeri de 1 artar.
template<typename T>
boost::shared_ptr<T> make_shared_ptr(std::shared_ptr<T>& ptr)
{
  return boost::shared_ptr<T>(ptr.get(), [ptr](T*) mutable {ptr.reset();});
}

template<typename T>
std::shared_ptr<T> make_shared_ptr(boost::shared_ptr<T>& ptr)
{
  return std::shared_ptr<T>(ptr.get(), [ptr](T*) mutable {ptr.reset();});
}
boost::shared_ptr ve any tipin saklanması
boost::any sakladığı tipin ValueType olmasını ister. Eğer tipiniz böyle değilse boost::share_ptr<boost::any>> şeklinde kullanamayız. Bir çözüm burada.

Hiç yorum yok:

Yorum Gönder