【发布时间】:2018-04-10 16:15:26
【问题描述】:
几天前我遇到过这种方法(作为C++ course 中编程任务的解决方案之一)。
#include <iostream>
struct C {
C(int i) { m_i = i; }
private:
int m_i;
};
template<typename Tag, int C::* M>
struct Rob {
friend
int C::* get(Tag) {
return M;
}
};
template<typename D>
struct AcessorTag {
typedef D C::*type;
};
template struct Rob<AcessorTag<int>, &C::m_i>;
int &get_c(C &cls) {
return cls.*get(AcessorTag<int>());
}
int main()
{
C c(13);
std::cout << get_c(c);
return 0;
}
你能解释一下为什么这段代码可以编译吗?这里发生的几乎所有事情都是 1) 我们将指向成员的指针作为参数传递给结构模板 2) 我们声明了一个友元函数,该函数只将该指针返回给成员。
这是标准的 C++ 吗? (我在 VS 2015 上测试过)
get 函数是struct Rob<> 的朋友,但不是struct C 的朋友。反正struct C好像没有朋友,怎么可以访问它的私人会员呢?
谢谢!
【问题讨论】:
-
不使用 gcc 编译,虽然错误是
t.cpp:25:38: error: ‘get’ was not declared in this scope。我很惊讶 VS 没有标记那个错误。 -
作为旁注,一个好的旧时尚可以防止墨菲而不是马基雅维利课程gotw.ca/gotw/076.htm