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

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

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

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

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

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

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

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

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

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

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

11

Решение

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

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

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);}

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

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector