Ответ 1
Существуют разные подходы:
-
С С++ 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::stoi
int 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);
Примечание. Невозможно сделать псевдоним для перегруженной функции таким образом, чтобы все ее перегруженные версии работали, поэтому вы всегда должны указывать, какую именно перегрузку функции вы хотите.
-
С С++ 14 вы можете пойти еще дальше с переменными шаблона
constexpr
. Это позволяет вам использовать шаблонные функции:template<typename T> constexpr void old_function(/* args */); template<typename T> constexpr auto alias_to_old = old_function<T>;
-
Кроме того, начиная с С++ 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);