面试题答案
一键面试设计思路
- 利用友元关系:在目标类中将访问非公有成员的模板类或函数声明为友元,这样就获得了访问非公有成员的权限。
- 模板元编程:通过模板参数来传递目标类的类型以及要访问的非公有成员的信息,实现通用的访问机制。
模板元编程关键技术点
- 模板参数推导:准确推导目标类类型以及非公有成员的相关信息,如成员函数指针、成员变量指针等。
- 编译期计算:在编译期确定访问的正确性和类型安全性,避免运行时错误。
处理不同类型非公有成员访问
- 成员变量:通过模板参数传递成员变量指针,在模板类或函数中使用指针来访问成员变量。
- 成员函数:通过模板参数传递成员函数指针,在模板类或函数中使用函数指针来调用成员函数。
以下是一个简单示例:
template <typename T, typename MemberType, MemberType T::*memberPtr>
class Accessor {
public:
static MemberType get(T& obj) {
return obj.*memberPtr;
}
};
class MyClass {
private:
int privateVar;
public:
MyClass(int val) : privateVar(val) {}
// 声明Accessor为友元
template <typename T, typename MemberType, MemberType T::*memberPtr>
friend class Accessor;
};
int main() {
MyClass obj(42);
// 使用Accessor访问非公有成员
int value = Accessor<MyClass, int, &MyClass::privateVar>::get(obj);
return 0;
}
在这个示例中,Accessor
模板类通过模板参数 T
确定目标类类型,MemberType
确定非公有成员类型,memberPtr
确定要访问的具体成员。通过将 Accessor
声明为 MyClass
的友元,实现了以类型安全的方式访问非公有成员变量 privateVar
。对于成员函数的访问类似,只是将成员变量指针替换为成员函数指针,并进行相应的函数调用操作。