如何用C++的using关键字声明非指针函数类型(替代typedef)?
使用C++11的
using声明非指针函数类型 嘿,我明白你遇到的困惑了——用using声明函数指针类型已经顺手,但转去非指针的函数类型就卡壳了对吧?其实核心是要理解typedef和using在语法上的“顺序差异”,咱们一步步理清楚:
先回顾typedef的写法
你肯定知道,用typedef声明非指针的函数类型是这样的:
// 声明一个非指针的函数类型:返回void,参数是int typedef void FuncType(int);
对应的函数指针类型是:
typedef void (*FuncPtr)(int);
转换为using的正确写法
using的语法逻辑是**「别名 = 完整类型」**,和typedef的「完整类型 别名」顺序刚好相反。所以对于非指针的函数类型,你只需要把完整的函数签名(返回值+参数列表)放到等号右边就行:
// 正确:非指针函数类型 using FuncType = void(int); // 对应的函数指针类型(你已经熟悉的写法) using FuncPtr = void(*)(int);
为什么你之前的尝试无效?
你提到“移除typedef名称并放到using之后”的方法没用,大概率是写成了这样的错误形式:
// 错误!这不符合using的语法规则 using void FuncType(int);
这种写法还是沿用了typedef的结构,但using要求必须是「别名 = 类型」的格式,所以把完整的函数类型void(int)作为整体放在等号右侧才是正确的。
怎么使用这个非指针函数类型?
函数类型不能直接实例化对象,但可以用来声明引用或者作为模板参数:
// 定义一个符合FuncType的函数 void myFunc(int x) { printf("Number: %d\n", x); } int main() { // 用非指针函数类型绑定函数引用 FuncType& funcRef = myFunc; funcRef(42); // 等价于直接调用myFunc(42) // 也可以把函数引用转换成函数指针 FuncPtr funcPtr = &funcRef; funcPtr(100); }
总结
用using声明非指针函数类型的关键就是:把**完整的函数签名(包括返回值和参数列表)**当作一个整体类型,放到using 别名 =的右侧,就像声明其他普通类型的别名一样。
内容的提问来源于stack exchange,提问作者BeeOnRope
相关产品推荐
相关产品推荐

