Как назначить псевдоним имени функции в C ++?
Легко создать новое имя для типа, переменной или пространства имен. Но как назначить новое имя функции? Например, я хочу использовать имя holler
для printf
. #define очевиден … любым другим способом?
Решения:
-
#define holler printf
-
void (*p)() = fn; //function pointer
-
void (&r)() = fn; //function reference
-
inline void g(){ f(); }
- Восстановление размера windows с помощью нескольких мониторов
- Должен ли я компилироваться с / MD или / MT?
- Масштабирование графики на основе текущей позиции мыши
- Создание определенного текста в текстовом поле
- Как сделать шифрование с использованием AES в Openssl
- Что делает ключевое слово «new» для структуры на C #?
- Использовать cookies из CookieContainer в WebBrowser
- Лучшая практика для возврата ошибок в ASP.NET Web API
- Когда использовать цикл Parallel.ForEach вместо обычного foreach?
- две разные библиотеки DLL с одинаковым пространством имен
- Будет ли оператор «variableName;» C ++ всегда оставаться без оператора?
- Список C # Сортировать по x, тогда y
- Если я хочу специализироваться только на одном методе в шаблоне, как мне это сделать?
Существуют разные подходы:
-
С 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)...); \ }