Перегрузка унарного оператора - PullRequest
16 голосов
/ 20 июня 2011

Рассмотрим класс с перегруженным унарным оператором & (Address-of).Пусть это будет class A

template <class C>
class A
{
public:
    C * operator &()
    {
        return &data;
    }
    //...
private:
    C data;
}

Теперь я хочу передать какой-то функции указатель типа A для заполнения data.Давайте назовем это f

void f(A * auto_containter)
{
    //...
}

Но ясно, почему приведенный ниже код не будет работать (даже не будет компилироваться).Это вызвано тем, что перегруженный оператор вызывается.

A a;
f(&a);

Вопрос заключается в следующем:

Существует ли какой-либо синтаксис для передачи адреса от a до f?Если нет, то для меня очень странно, почему разрешается перегружать унарный код operator &, потому что это делает код более глючным и трудным для понимания.Или есть другие причины?

Ответы [ 6 ]

17 голосов
/ 20 июня 2011

Есть ли синтаксис для передачи адреса от a до f?

Да, уродливый синтаксис:

f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );

boost::addressof - это приятная и универсальная обертка вокруг нее.

13 голосов
/ 20 июня 2011

Используйте функцию boost::addressof. В любом случае перегрузка одинарная и весьма сомнительная. Почему это вместо именованной функции, которая возвращает адрес ваших данных?

4 голосов
/ 20 июня 2011

Существует ли какой-либо синтаксис для передачи адреса a в f?

Другие уже указали boost::addressof.Механизм, на который он опирается, - это стандартно гарантированное использование встроенного адресного оператора для ссылочного типа reinterpret_cast.Функция Boost просто оборачивает довольно многословную и неуклюжую комбинацию приведений.

Если нет, то для меня очень странно, почему допускается перегрузка унарного оператора &, потому что если это сделает код более глючными трудно понять.Или есть и другие причины?

В некоторых случаях это может быть удобнее.Например, класс интеллектуального указателя может предложить пользовательский адресный оператор , чтобы поддерживать запись &p в качестве фактического аргумента в формальный аргумент T**.Тем не менее, я думаю, что в настоящее время общепризнанно, что это не такая уж хорошая идея.

Приветствия & hth.,

2 голосов
/ 20 июня 2011

Почему вы хотите перегружать унарный operator&?

Кроме этого, есть boost::addressof.

1 голос
/ 20 июня 2011

Ваш сценарий никогда по-настоящему не подходит, потому что любой, кто пишет эту функцию, будет использовать ссылку, а не указатель. Кроме того, вы забыли создать экземпляр A с примером типа для C.

1 голос
/ 20 июня 2011

Именно поэтому было изобретено boost::addressof.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...