如何在C ++中为函数名称分配一个别名?

为types,variables或命名空间创build新名称很容易。 但是,我怎么给一个函数分配一个新的名字呢? 例如,我想使用printf的名字holler 。 #define是显而易见的…任何其他方式?

解决scheme:

  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<OVERLOADED_FN_TYPE>(old_fn_name); 

    例如:函数std::stoi有两个重载

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

    如果您想为第一个版本创build别名,则应使用以下内容:

     const auto& new_fn_name = static_cast<int(*)(const string&, size_t*, int)>(std::stoi); 

    注意:没有办法为重载函数创build一个别名,这样所有的重载版本都可以工作,所以你应该总是指定你想要的重载函数。

  • 使用C ++ 14,你可以进一步使用constexpr模板variables。 这允许你使用模板化函数:

     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) => af(3); 

您可以创build一个函数指针或函数引用:

 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,但保持单一的实现。