24 Haziran 2017 Cumartesi

boost::any_cast metodu

Pointer'a Olmayan Çevrim
Metodun içi şöyle.
template<typename ValueType>
ValueType * any_cast(any * operand) BOOST_NOEXCEPT
{
  return operand && operand->type() == boost::typeindex::type_id<ValueType>()
  ? 
  &static_cast<any::holder<BOOST_DEDUCED_TYPENAME remove_cv<ValueType>::type> *>
   (operand->content)->held
  : 0;
}
Eğer çevrim gerçekleştirilemiyorsa bad_any_cast exception atılır. Elimizde şöyle bir değişken olsun
boost::any a = 1;
Bu değişkeni bool'a çevirmek istersek exception fırlatılır.
try {
  boost::any_cast<bool>(a);
}
catch(...) {
  std::cout << "caught" << std::endl;
}
Pointer'a Çevrim
Eğer çevrim gerçekleştirilemiyorsa null döner. Açıklaması şöyle
Returns: If passed a pointer, it returns a similarly qualified pointer to the value content if successful, otherwise null is returned. If T is ValueType, it returns a copy of the held value, otherwise, if T is a reference to (possibly const qualified) ValueType, it returns a reference to the held value.
Throws: Overloads taking an any pointer do not throw; overloads taking an any value or reference throws bad_any_cast if unsuccessful.
Elimizde şöyle bir değişken olsun
boost::any a = 1;
Değişken aynı tipten pointer'a çevrilemiyorsa null döner.
bool *p = boost::any_cast<bool>(&a); 
// Prints true
std::cout << std::boolalpha << (p == nullptr) << std::endl;
Çevrilebiliyorsa düzgün bir pointer döner
int *q = boost::any_cast<int>(&a); 
// Prints false
std::cout << std::boolalpha << (q == nullptr) << std::endl;
Çevrim Örnekleri
Şöyle yaparız.
#include <boost/any.hpp>
int main()
{
  // Any holding a value
  {
    boost::any any_value(1);
    int  value = boost::any_cast<int>(any_value);
    int& reference = boost::any_cast<int&>(any_value);
    int* pointer = boost::any_cast<int>(&any_value);
  }

  // Any holding a pointer (which is nothing else but a value)
  {
    int integer = 0;
    boost::any any_ptr(&integer);
    int * pointer = boost::any_cast<int*>(any_ptr);
    int*& pointer_reference = boost::any_cast<int*&>(any_ptr);
    int** pointer_pointer = boost::any_cast<int*>(&any_ptr);
  }
}

Hiç yorum yok:

Yorum Gönder