Псевдонимы функций класса С++
Мне было интересно, был ли простой способ написать псевдоним функции класса С++. Например, если у меня есть контейнер 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(); }
Или существует ли какой-либо строгий синтаксис псевдонимов для С++? (Я не мог найти ни одного - не был уверен)
Итак, каков был бы самый эффективный способ сделать это?
РЕДАКТИРОВАТЬ: Я принял ответ просто, чтобы закончить вопрос, поскольку это только мое любопытство. Любой, у кого есть хорошая информация, добавьте комментарии или ответ,, и я даже могу изменить свой ответ.
Ответы
Ответ 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 должен в основном просто заменить псевдоним на фактический вызов функции.
См. также проводка Предоставление функции более чем одному имени. В нем приводятся некоторые причины, по которым вы не можете этого делать.