Подтвердить что ты не робот

Псевдонимы функций класса С++

Мне было интересно, был ли простой способ написать псевдоним функции класса С++. Например, если у меня есть контейнер list, логическая функция будет

    int list::length() { return len; }

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

    int list::size() { return len; }

Итак, вместо того, чтобы писать обе функции с их полным телом, есть ли способ сделать list::size() псевдоним list::length() таким, что он не является дубликатом при компиляции, а скорее ссылается на ту же функцию?

Я читал, что вы можете сделать это с помощью #define, но я не хочу приводить к путанице с другими кодовыми именами где-то полностью вне видимости (т.е. переменной размера).
Я также прочитал, что указатели на функции могут его исправить, но это не совсем псевдоним (поскольку он должен применять де-ссылку), а также не может указывать указатели на указатели, что дает ему путаную линию помощи пользователям ( Я бы подумал), плюс путаница, если мне когда-либо понадобится вставить мой код внутри другого объекта (мне нужно настроить область).

Один из моих догадок заключается в следующем: если большинство оптимизирующих компиляторов будут считаться прямым псевдонимом функции:

    inline int list::length() { return len; }
    inline int list::size() { return length(); }

Или существует ли какой-либо строгий синтаксис псевдонимов для С++? (Я не мог найти ни одного - не был уверен)
Итак, каков был бы самый эффективный способ сделать это?

РЕДАКТИРОВАТЬ: Я принял ответ просто, чтобы закончить вопрос, поскольку это только мое любопытство. Любой, у кого есть хорошая информация, добавьте комментарии или ответ,, и я даже могу изменить свой ответ.

4b9b3361

Ответ 1

Я бы не использовал препроцессор и #define для этого. В целом препроцессор должен быть последним средством на С++. Смотрите Часто задаваемые вопросы по С++ в встроенных функциях, в котором также содержится раздел о различных ошибках использования макросов препроцессора.

Подход, который я использовал бы, состоял бы в том, чтобы иметь функцию, которая будет иметь несколько различных псевдонимов с более сложной функцией и интерфейсом, которые вы бы сделали примерно так:

int list::length(string xString, int iValue) {
  int iReturnValue = 0;  // init the return value
  //  do stuff with xString and iValue and other things
  return iReturnValue;
}

Затем для псевдонима сделайте следующее:

inline int list::size(string xString, int iValue) {return length(xString, iValue);}

Inline должен в основном просто заменить псевдоним на фактический вызов функции.

См. также проводка Предоставление функции более чем одному имени. В нем приводятся некоторые причины, по которым вы не можете этого делать.