Создать новое имя для типа, переменной или пространства имен легко. Но как мне присвоить новое имя функции? Например, я хочу использовать имя holler
для printf
. #define очевидно ... иначе?
Решения:
#define holler printf
void (*p)() = fn; //function pointer
void (&r)() = fn; //function reference
inline void g(){ f(); }
void (&NewName)(some_vector&, float, float, float, float) = OldName;
во время моей следующей регистрации.printf
здесь. Это был только пример. Проблема здесь больше связана с ограничениями английского, чем с чем-либо еще. У меня есть одна функция, обслуживающая цель A и цель B, но я просто не могу найти здесь одно имя, служащее обеим целям.T &a = b;
создает новое имя дляb
.typedef
для типов иnamespace A=B;
для пространств имен.using BaseClass::BaseClassMethod
, и естьusing AliasType = Type;
, и даже естьnamespace AliasNamespace = Namespace;
. Нам не хватаетusing AliasFunction = Function;
Ответы:
Есть разные подходы:
В C ++ 11 с ненагруженными функциями, не являющимися шаблонами, вы можете просто использовать:
Если эта функция имеет несколько перегрузок, вы должны использовать
static_cast
:Пример: есть две перегрузки функции
std::stoi
Если вы хотите создать псевдоним для первой версии, вы должны использовать следующее:
Примечание: невозможно создать псевдоним для перегруженной функции, чтобы все ее перегруженные версии работали, поэтому вы всегда должны указывать, какую именно перегрузку функции вы хотите.
В C ++ 14 вы можете пойти еще дальше с
constexpr
шаблонными переменными. Это позволяет использовать псевдонимы для шаблонных функций:Более того, начиная с C ++ 11 у вас есть функция,
std::mem_fn
которая позволяет использовать псевдонимы для функций-членов. См. Следующий пример:источник
constexpr
подходом к шаблонным переменным: псевдоним не может определять тип. Компилятор требует, чтобы я предоставил список параметров шаблона (я пишу вариативную функцию шаблона): не может ссылаться на шаблон переменной `alias_to_old 'без списка аргументов шаблонаconstexpr auto new_fn_name = old_fn_name
работает в C ++ 11 (по крайней мере, в gcc 4.9.2) и лучше, чем размещение&
. Он не требует, чтобы вызов всегда выполнялся через указатель, и, таким образом, позволяет встроить функцию вместо вызова.constexpr auto holler = [] ( auto &&...args ) { return printf( std::forward<decltype(args)>( args )... ); };
std::mem_fn
это не псевдоним , так как он выполняет гораздо больше магии за смыслом.Вы можете создать указатель на функцию или ссылку на функцию:
источник
fn
, используя псевдоним? Можете ли вы объяснить указатель на функцию и ссылку на функцию? Насколько они разные? Они здесь такие же?r();
void (&r)() = this->fn;
Должен ты в порядке.
источник
decltype
как это было введено в C ++ 11. Кроме того, это также должно работать со старым добрым простым C.int (*holler)(const char*, ...) = std::printf;
источник
Используйте встроенную оболочку. Вы получаете оба API, но сохраняете единую реализацию.
источник
Из fluentcpp : ALIAS_TEMPLATE_FUNCTION (f, g)
источник
С помощью общих лямбда-выражений C ++ 14 я смог сделать следующее, что также должно работать, когда целевая функция имеет несколько перегрузок:
источник
Здесь стоит упомянуть ИМО, что хотя исходный вопрос (и отличные ответы) определенно полезен, если вы хотите переименовать функцию (для этого есть веские причины!), Если все, что вы хотите сделать, это вырезать глубокое пространство имен, но сохраните имя, для этого есть
using
ключевое слово:Это также имеет то преимущество, что оно ограничено областью видимости, хотя вы всегда можете использовать его на верхнем уровне файла. Я часто использую это для
cout
иendl
поэтому мне не нужно , чтобы принести во всехstd
с классическимusing namespace std;
в верхней части файла, но также полезно , если вы используете что - то вродеstd::this_thread::sleep_for()
много в одном файле или функции, но не везде, и никакие другие функции из пространства имен. Как всегда, не рекомендуется использовать его в файлах .h, иначе вы загрязните глобальное пространство имен.Это не то же самое, что "переименование" выше, но часто действительно то, что нужно.
источник