оператор перегрузки () - PullRequest
       19

оператор перегрузки ()

1 голос
/ 22 декабря 2011

У меня есть это объявление

struct Z {
    void operator ()( int a ) {
        cout << "operator()() " << a << endl;
    }
};

Z oz, *zp = &oz;

oz(1); //ok
(*zp)(2); //ok
zp(3); //"error: 'zp' cannot be used as a function"

Есть ли способ изменить объявление структуры, чтобы вызов № 3 был успешным?

Ответы [ 2 ]

5 голосов
/ 22 декабря 2011

Это ожидаемое поведение. zp - это указатель (a Z *), а operator() перегружен для Z, а не Z *. Когда вы обращаетесь к указателю с помощью *zp, вы получаете Z &, для которого operator() перегружено .

К сожалению, вы не можете перегрузить оператор для типа указателя (я думаю, что это как-то связано с тем, что указатели не являются пользовательскими типами, но у меня нет Стандарта передо мной). Вы можете упростить синтаксис с помощью ссылок:

Z & r = *zp;
r(3);
0 голосов
/ 22 декабря 2011

Если ваш тип Z не имеет состояния, вы можете изменить его на функцию.

typedef void Y(int);
void y( int a ) {
  cout << "y() " << a << endl;
}

Y& oy = y;
Y* yp = &oy;

Теперь и oy(1), и yp(1) допустимы, поскольку указатели на функции неявно разыменовываются при вызове.

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