如何在C ++中为函数名称分配一个别名?
为types,variables或命名空间创build新名称很容易。 但是,我怎么给一个函数分配一个新的名字呢? 例如,我想使用printf
的名字holler
。 #define是显而易见的…任何其他方式?
解决scheme:
-
#define holler printf
-
void (*p)() = fn; //function pointer
-
void (&r)() = fn; //function reference
-
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,但保持单一的实现。