gpt4 book ai didi

c++ - 寻找一种优雅且非侵入式的方式来访问类的私有(private)方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:06 28 4
gpt4 key购买 nike

免责声明:这绝不会用于生产代码。这是对 C++ 边缘的探索 :)

我的问题是跟进,基于与@Johannes Schaub 的讨论: calling private methods in c++ .

我在他的博客上找到了一个非常简短的私有(private)成员访问解决方案: 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;
}

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

我想要的是方法调用的相同简单方法:

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: error: invalid use of non-static member function 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()))();

关于c++ - 寻找一种优雅且非侵入式的方式来访问类的私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39648419/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com