🕵️
Введение в паттерны
  • Введение в паттерны
  • Паттерны
    • Оглавление
    • Порождающие паттерны
      • Фабричный метод
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Абстрактная фабрика
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Прототип
        • Реализации на С++
        • Реализации на Kotlin
        • Реализации на Java
        • Возможные реализации для решения конкретных задач на С++
      • Строитель
        • Реализации на С++
        • Реализации на Kotlin
      • Одиночка
        • Реализации на C++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Пул объектов
        • Реализации на С++
    • Структурные паттерны
      • Адаптер
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач
      • Декоратор
        • Реализации на С++
        • Реализации на Kotlin
      • Компоновщик
        • Реализации на С++
      • Мост
        • Реализации на С++
      • Заместитель
        • Реализации на С++
        • Реализации на Kotlin
      • Фасад
        • Реализации на С++
      • Приспособленец
        • Реализации на С++
    • Поведенческие паттерны
      • Стратегия
        • Реализации на С++
        • Реализации на Kotlin
      • Команда
        • Реализации на С++
        • Реализации на Kotlin
      • Цепочка обязанностей
        • Реализации на С++
        • Реализации на Kotlin
      • Подписчик-издатель
        • Реализации на С++
        • Реализации на Kotlin
      • Посетитель
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
      • Посредник
        • Реализации на С++
        • Реализации на Kotlin
      • Шаблонный метод
        • Реализации на С++
      • Опекун
        • Реализации на С++
      • Итератор
        • Реализации на С++
        • Реализации на Kotlin
      • Свойство
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
  • Введение в идиомы
  • Идиомы
    • Оглавление
    • RAII
    • Type erasure
      • Контейнеры с type erasure
    • CRTP
    • Статический полиморфизм
    • Shrink to fit
    • Proxy
    • Erase remove
    • Decltype (auto)
    • Copy and swap
    • Safe bool
    • Scope guard
    • Addressof
Powered by GitBook
On this page
  • Назначение
  • Решаемые задачи
  • Общая реализация на языке C++

Was this helpful?

  1. Идиомы

Addressof

Назначение

Идиома Addressof используется для получения адреса объекта. Она позволяет получить фактический адрес, где данные хранятся в памяти компьютера. Затем этот адрес может быть использован для различных целей, например, для передачи в функцию, сохранения в указатель или создания ссылки.

Решаемые задачи

  • Нахождение реального адреса объекта в памяти

C++ позволяет перегружать унарный оператор амперсанда (&) для типов классов. Тип возврата такого оператора не обязательно должен быть фактическим адресом объекта. Идиома addressof позволяет найти реальный адрес объекта независимо от перегруженного унарного оператора амперсанда и его защиты доступа.

Общая реализация на языке C++

Внутри функции addressof() используется оператор reinterpret_cast, который выполняет преобразование указателей между различными типами. В данном случае, функция addressof использует reinterpret_cast для преобразования ссылки на объект типа T в указатель на этот объект. Преобразование начинается с преобразования ссылки на объект типа T в ссылку на объект типа const volatile char, чтобы обеспечить максимальную возможную совместимость между типами. Затем используется оператор const_cast для удаления квалификатора const с ссылки на объект типа const volatile char, чтобы получить ссылку на изменяемый объект типа volatile char.

template<class T>
T *addressof(T &v)
{
    return reinterpret_cast<T *> (&const_cast<char &> (reinterpret_cast <const volatile char &> (v)));
}
int main()
{
    nonaddressable na;
    nonaddressable *naptr = addressof(na);
    
    return 0;
}
PreviousScope guard

Last updated 1 year ago

Was this helpful?