21 Eylül 2015 Pazartesi

std::addressof

Giriş
std::addressof() C++11 ile yeni gelen bir metod. Kullanmak için <memory> dosyası include edilmeli.

Açıklaması şöyle. smart pointer'larda nesnenin adresini almak için kullanılır.Bu metoda hiç ihtiyacım olmadı. Ancak anladığım kadarıyla eğer & operatörü override edilmişse
bu metodu kullanarak nesnenin adresini alabiliriz.
& is often overloaded when building smart pointer classes, as it makes them easier to use: more often than not you want the bare managed pointer, not the address of the smart pointer object.

Neglecting the evolutionary backwater that was std::auto_ptr, smart pointer classes such as std::unique_ptr and std::shared_ptr have been introduced into the standard since C++11. std::addressof was introduced in that standard since taking the real address of an object is occasionally required.

Gerçekleştirim
GCC ve boost tarafından gerçekleştirimi şöyle.
reinterpret_cast<T*>(
    &const_cast<char&>(
        reinterpret_cast<const volatile char &>(object)))
Muhtemel gerçekleştirimi şöyle
template< class T >
T* addressof(T& arg) 
{
    return reinterpret_cast<T*>(
               &const_cast<char&>(
                  reinterpret_cast<const volatile char&>(arg)));
}
Örnek
Kullanımına dair bir örnek
#include <memory>
#include <iostream>

struct A {
    A* operator &() {return nullptr;}
};

int main () {
    A a;
    std::cout << &a << '\n';              // Prints 0
    std::cout << std::addressof(a);       // Prints a's actual address
}



Hiç yorum yok:

Yorum Gönder