V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wutiantong
V2EX  ›  C++

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

  •  
  •   wutiantong · 2018-11-23 16:59:16 +08:00 · 2187 次点击
    这是一个创建于 2191 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    这有点像 java 里面 static 内部类和 non-static 内部类的区别。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   920 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 22:17 · PVG 06:17 · LAX 14:17 · JFK 17:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.