如何在C++中获取模板成员函数实例的地址?
获取C++模板成员函数实例的地址
你遇到的问题核心在于成员函数指针的语法规则和普通函数指针完全不同,必须通过类作用域限定并配合取地址符才能正确获取模板成员函数的地址。
错误原因分析
在类内部直接写f<true>时,编译器会优先将其解析为函数调用而非取地址操作;同时decltype(f<true>)无法正确推导成员函数的类型——成员函数的类型是void (X::*)()(指向X类的无参void成员函数的指针),而非普通的void (*)()函数指针,这就是编译报错的根本原因。
修正后的代码
要正确获取模板成员函数的地址,需要做到两点:
- 用
&X::f<true>的形式明确指定要获取的是类X的模板成员函数实例的地址 - 用
decltype(&X::f<true>)来推导正确的成员函数指针类型
class X { public: template<bool B> inline void f() {} // 正确获取模板成员函数地址并推导类型 decltype(&X::f<true>) truef = &X::f<true>; decltype(&X::f<false>) falsef = &X::f<false>; // 如果需要指针本身不可修改(const指针),可以添加const修饰 const decltype(&X::f<true>) const_truef = &X::f<true>; };
为什么非成员版本可以正常运行?
非成员函数的地址可以直接通过f<true>获取,因为编译器能直接识别这是对函数指针的引用,无需类作用域限定;而成员函数属于类的一部分,必须通过&类名::函数名<模板参数>的语法,明确告诉编译器你要取的是成员函数的地址,而非调用函数。
内容的提问来源于stack exchange,提问作者Sourav Kannantha B
相关产品推荐
相关产品推荐

