最近看 pointer 相关的type_traits
,赫然发现除了is_pointer
居然还有个is_member_pointer
(更进一步的还有is_member_object_pointer
& is_member_function_pointer
)
我就很奇怪:指向对象成员的指针和普通指针有什么不一样啊? 我以为是这样的:
struct a_class { int i };
int main()
{
a_class aobj;
static_assert(std::is_member_object_pointer<decltype(&aobj.i)>::value, "not right?");
}
看来是我想当然了,那么到底怎样才是 member object pointer 呢?结果是这样的:
static_assert(std::is_member_object_pointer<decltype(&a_class::i)>::value, "this is fine");
&a_class::i
Aha...WTF? 这种指针到底是什么意思,有什么用呢?
欲知详情请参考: https://en.cppreference.com/w/cpp/language/pointer ,这里直接搬运一下里面的示例代码吧:
struct C { int m; };
int main()
{
int C::* p = &C::m; // pointer to data member m of class C
C c = {7};
std::cout << c.*p << '\n'; // prints 7
C* cp = &c;
cp->m = 10;
std::cout << cp->*p << '\n'; // prints 10
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.