Перегрузка унарного оператора
Рассмотрим класс с перегруженным унарным оператором & (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 ответов
Использование boost::addressof
функция. В любом случае перегрузка одинарная и весьма сомнительная. Почему это вместо именованной функции, которая возвращает адрес ваших данных?
Есть ли синтаксис для передачи адреса
a
вf
?
Да, уродливый синтаксис:
f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );
boost::addressof
хороший и общий обертка вокруг него.
Есть ли синтаксис для передачи адреса от а до F?
Другие уже указали boost::addressof
, Механизм, на который он опирается, является стандартно гарантированным использованием встроенного адресного оператора для reinterpret_cast
на ссылочный тип. Функция Boost просто оборачивает довольно многословную и неуклюжую комбинацию приведений.
Если нет, то для меня очень странно, почему допускается перегрузка унарного оператора &, потому что если это сделает код более глючным и трудным для понимания. Или есть другие причины?
В некоторых случаях это может быть более удобным. Например, класс интеллектуального указателя может предлагать пользовательский оператор адреса для поддержки записи &p
в качестве фактического аргумента T**
формальный аргумент. Тем не менее, я думаю, что в настоящее время общепризнанно, что это не слишком хорошая идея.
Ура & hth.,
Зачем вам перегружать унар operator&
?
Помимо этого, есть boost::addressof
,
Ваш сценарий никогда не подходит, потому что любой, кто пишет эту функцию, будет использовать ссылку, а не указатель. Кроме того, вы забыли создать экземпляр типа A с примером типа C.