Как назначить псевдоним имени функции в C++?
создать новое имя для типа переменной или пространства имен. Но как мне назначить новое имя функции? Например, я хочу использовать имя holler на printf. #определить, является очевидным... а как иначе?
решения:
#define holler printfvoid (*p)() = fn; //function pointervoid (&r)() = fn; //function referenceinline void g(){ f(); }
6 ответов:
есть разные подходы:
С C++11 С не шаблонными не перегруженными функциями вы можете просто использовать:
const auto& new_fn_name = old_fn_name;если эта функция имеет несколько перегрузок, вы должны использовать
static_cast:const auto& new_fn_name = static_cast<OVERLOADED_FN_TYPE>(old_fn_name);пример: есть две перегруженные функции
std::stoiint stoi (const string&, size_t*, int); int stoi (const wstring&, size_t*, int);если вы хотите сделать псевдоним в первой версии, вы должны использовать следующее:
const auto& new_fn_name = static_cast<int(*)(const string&, size_t*, int)>(std::stoi);Примечание: невозможно сделать псевдоним перегруженной функции таким, чтобы все ее перегруженные версии работали, поэтому вы всегда должны указывать, какую именно перегрузку функции вы хотите.
С C++14, вы можете пойти еще дальше с
constexprпеременные шаблона. Это позволяет создавать псевдонимы шаблонных функций:template<typename T> constexpr void old_function(/* args */); template<typename T> constexpr auto alias_to_old = old_function<T>;кроме того, начиная с 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) => a.f(3);
вы можете создать указатель на функцию или ссылку на функцию:
void fn() { } //... void (*p)() = fn;//function pointer void (&r)() = fn;//function reference
typedef int (*printf_alias)(const char*, ...); printf_alias holler = std::printf;должно сделать вас хорошо.
С fluentcpp: ALIAS_TEMPLATE_FUNCTION (f, g)
#define ALIAS_TEMPLATE_FUNCTION(highLevelF, lowLevelF) \ template<typename... Args> \ inline auto highLevelF(Args&&... args) -> decltype(lowLevelF(std::forward<Args>(args)...)) \ { \ return lowLevelF(std::forward<Args>(args)...); \ }
Comments