【发布时间】:2019-02-27 15:56:38
【问题描述】:
受this answer这个号称颠覆门禁系统的启发,我写了下面这个最小版的hack
template<typename T>
inline T memptr{};
template<auto Val>
struct setptr
{
struct setter { setter() { memptr<decltype(Val)> = Val; } };
static setter s;
};
template<auto Val>
typename setptr<Val>::setter setptr<Val>::s{};
然后是used as
class S
{
int i;
};
template struct setptr<&S::i>;
auto no_privacy(S& s)
{
return s.*memptr<int S::*>;
}
为什么template struct setptr<&S::i>; 没有违反访问控制?
是不是因为[class.access]
访问控制统一应用于所有名称,无论名称是从声明还是表达式引用。
具体不包括实例化?在这种情况下,为什么不包括实例化?
勘误表:显式实例化也被归类为声明。
【问题讨论】:
-
我们实际上在代码库中的一个位置使用了这个“hack”,以便能够调用我们真正需要的库中的私有成员函数/i> call ;-) 但是,我怀疑它在测试框架中也很有用,您可能希望测试受保护的和私有的成员,而不必注入朋友和其他东西。
-
@MaxLanghof 我确实看到了这些,但找不到他们声称的来源。
-
我们过去常常通过访问底层
FILE句柄来解决旧版 Visual Studio 中存在错误的std::fstream实现
标签: c++ language-lawyer