Как назначить псевдоним имени функции в C ++?

Легко создать новое имя для типа, переменной или пространства имен. Но как назначить новое имя функции? Например, я хочу использовать имя holler для printf . #define очевиден … любым другим способом?

Решения:

  1. #define holler printf
  2. void (*p)() = fn; //function pointer
  3. void (&r)() = fn; //function reference
  4. inline void g(){ f(); }

Существуют разные подходы:

  • С C ++ 11 с не-шаблонами без перегруженных функций вы можете просто использовать:

     const auto& new_fn_name = old_fn_name; 
  • Если эта функция имеет несколько перегрузок, вы должны использовать static_cast :

     const auto& new_fn_name = static_cast(old_fn_name); 

    Пример: есть две перегрузки функции std::stoi

     int stoi (const string&, size_t*, int); int stoi (const wstring&, size_t*, int); 

    Если вы хотите создать псевдоним для первой версии, вы должны использовать следующее:

     const auto& new_fn_name = static_cast(std::stoi); 

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

  • С C ++ 14 вы можете пойти еще дальше с переменными-шаблонами constexpr . Это позволяет вам выполнять функции шаблонов:

     template constexpr void old_function(/* args */); template constexpr auto alias_to_old = old_function; 
  • Более того, начиная с C ++ 11 у вас есть функция std::mem_fn которая позволяет выполнять функции-члены-члены. См. Следующий пример:

     struct A { void f(int i) { std::cout << "Argument: " << i << '\n'; } }; A a; auto greet = std::mem_fn(&A::f); // alias to member function // prints "Argument: 5" greet(a, 5); // you should provide an object each time you use this alias // if you want to bind an object permanently use `std::bind` greet_a = std::bind(greet, a, std::placeholders::_1); greet_a(3); // equivalent to greet(a, 3) => af(3); 

Вы можете создать указатель на функцию или ссылку на функцию:

 void fn() { } //... void (*p)() = fn;//function pointer void (&r)() = fn;//function reference 
 typedef int (*printf_alias)(const char*, ...); printf_alias holler = std::printf; 

Должно быть хорошо.

int (*holler)(const char*, ...) = std::printf;

Используйте встроенную оболочку. Вы получаете оба API, но сохраняете единую реализацию.

Из fluentcpp : ALIAS_TEMPLATE_FUNCTION (f, g)

 #define ALIAS_TEMPLATE_FUNCTION(highLevelF, lowLevelF) \ template \ inline auto highLevelF(Args&&... args) -> decltype(lowLevelF(std::forward(args)...)) \ { \ return lowLevelF(std::forward(args)...); \ } 
  • Саморегуляция между кодами рекурсивных отношений ко многим ко многим первым Entity Framework
  • Использование XmlSerializer для сериализации производных classов
  • Перечисление через свойства объекта (строка) в C #
  • Легкий способ разобрать URL-адрес на кросс-платформе C ++?
  • Как определить кодировку символов текстового файла?
  • Сравнивая две строки, игнорируя регистр в c #
  • Что такое std :: string :: c_str () lifetime?
  • Адрес указателя в многомерном массиве C
  • Байт для байтовой сериализации структуры в C #
  • Сгенерировать код вызова хвостового вызова
  • Является ли list :: size () действительно O (n)?
  • Давайте будем гением компьютера.