寻找一种优雅且非侵入性的方式来访问类的私有方法

Search for an elegant and nonintrusive way to access private methods of a class

本文关键字:方式 访问 有方法 一种 寻找      更新时间:2023-10-16

免责声明:这绝不意味着在生产代码中使用。这是对c++边缘的一次探索:)

我的问题是一个后续问题,基于与@Johannes Schaub的讨论:c++中调用私有方法

我在他的博客上找到了一个非常简短的解决方案:http://bloglitb.blogspot.de/2011/12/access-to-private-members-safer.html

下面是一个示例:

#include <iostream>
using namespace std;
// example class
struct A {
  A(int a, double b):_a(a),_b(b) { }
private:
  int _a;
  double _b;
  int f() { return _a; }
public:
};
//Robber template: provides a legal way to access a member
template<typename Tag, typename Tag::type M>
struct Rob { 
  friend typename Tag::type get(Tag) {
    return M;
  }
};
// tag used to access A::_a
struct A_access_a 
{ 
  typedef int A::*type;
  friend type get(A_access_a);
};
// Explicit instantiation; the only place where it is legal to pass the address of a private member.
template struct Rob<A_access_a, &A::_a>;
int main() {
    A sut(42, 2.2);
    int a = sut.*get(A_access_a());
    cout << a << endl;
    return 0;
}

我想知道是否可以重用这种非常优雅的方法来从类外部访问私有方法。

我想要的,是对方法调用同样简单的方法:

struct A_access_f
{
    typedef int (A::*type)();
    friend type get(A_access_f);
};
template struct Rob<A_access_f, &A::f>;

有可能让它运行吗?

这是我迄今为止最好的尝试:

typedef int (A::*pf)();
pf func = sut.*get(A_access_f());

我的编译器还在抱怨:

prog.cpp:45:33:错误:无效使用非静态成员函数pf func = sut.*get(A_access_f());

你差一点就成功了。以下是你应该写的:

typedef int (A::*pf)();
const pf func = get(A_access_f());
int a = (sut.*func)();

或者作为(难以理解的)一行代码:

int a = (sut.*get(A_access_f()))();