虫虫首页| 资源下载| 资源专辑| 精品软件
登录| 注册

您现在的位置是:首页 > 技术阅读 >  外部函数如何访问其它类的私有成员

外部函数如何访问其它类的私有成员

时间:2024-02-09

外部函数如何访问其它类的私有成员,你可能想到的是友元,然而友元会侵入原class的代码。


今天看到一个黑魔法:

#include <cstdlib>#include <iostream>
class Bank {private: double money = 999;
public: void check() { std::cout << "check:" << money << "\n"; }};
template<auto M>struct Tunnel;
template<class T, class U, T U::*M>struct Tunnel<M> { friend T& sneak(U& u) { return u.*M; }};
template struct Tunnel<&Bank::money>;double& sneak(Bank&);
int main() { Bank bank; bank.check();
auto& take_control = sneak(bank); auto booty = take_control; take_control = 0.114514; std::cout << "booty: " << booty << "\n";
bank.check();}
这个黑魔法的原理是C++可以显式实例化模板类,而显式实例化包括私有成员指针的特化。但这样还不够,即使显式实例化了,取不到私有成员的指针还是会调用不到这个特化。然而,C++有一个东西叫友元(friend),它除了可以让友元函数访问私有成员,还可以为该函数提供定义。这样一来,在友元函数的定义中使用模板参数(私有成员指针)访问私有成员,在外面不需要取得私有成员指针也能调用该友元函数。


来源:https://www.zhihu.com/question/521898260/answer/2394522797


还有个此黑魔法的开源库,用于访问类的私有成员很方便,看下使用代码:

class A {  int m_i = 3;};
ACCESS_PRIVATE_FIELD(A, int, m_i)
void foo() { A a; auto &i = access_private::m_i(a); assert(i == 3);}

这个开源库的地址在:https://github.com/martong/access_private


有兴趣的朋友可以研究研究。


这里有 一个优质的C++学习圈 等你加入。