分享一个 C++里较冷的知识点: Pointers to Members

2018-11-23 16:59:16 +08:00
 wutiantong

最近看 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
}
2187 次点击
所在节点    C++
1 条回复
wutiantong
2018-11-23 17:10:40 +08:00
总结一下它们的核心区别:
普通 pointer 可以随便 dereference,pointers to members 要需求一个对应类的实例才能 dereference

这有点像 java 里面 static 内部类和 non-static 内部类的区别。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/510863

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX