從博客文章Access to private members: Safer nastiness通過Johannes Schaub - litb:訪問私有成員模板招
template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
// use
struct A {
A(int a):a(a) { }
private:
int a;
};
// tag used to access A::a
struct A_f {
typedef int A::*type;
friend type get(A_f);
};
template struct Rob<A_f, &A::a>;
int main() {
A a(42);
std::cout << "proof: " << a.*get(A_f()) << std::endl;
}
如何get
功能,可從a
對象,因爲它不是內class A
定義打電話?
編輯:
我不明白爲什麼要必須有標籤的參數,而不是a.*get<A_f>()
=> OK它是由於ADL機制
似乎是一個奇怪的錯誤,當談到論證根據查找(ADL),我現在對我的黑莓,不能用它玩 - 但如果它編譯應該(從我的角度來看)被視爲一個錯誤。 –
有沒有人證實這個可以在gcc以外的編譯器上工作? – hexist
@hexist我剛剛在Clang(3.1)和Intel C++(13.0.0)上對此進行了驗證。 –