pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

      1. <legend id='sztQf'><style id='sztQf'><dir id='sztQf'><q id='sztQf'></q></dir></style></legend>
          <bdo id='sztQf'></bdo><ul id='sztQf'></ul>
        <tfoot id='sztQf'></tfoot>
      2. <small id='sztQf'></small><noframes id='sztQf'>

      3. <i id='sztQf'><tr id='sztQf'><dt id='sztQf'><q id='sztQf'><span id='sztQf'><b id='sztQf'><form id='sztQf'><ins id='sztQf'></ins><ul id='sztQf'></ul><sub id='sztQf'></sub></form><legend id='sztQf'></legend><bdo id='sztQf'><pre id='sztQf'><center id='sztQf'></center></pre></bdo></b><th id='sztQf'></th></span></q></dt></tr></i><div class="oaus0o0" id='sztQf'><tfoot id='sztQf'></tfoot><dl id='sztQf'><fieldset id='sztQf'></fieldset></dl></div>

        使用模板技巧訪問私人成員

        access private member using template trick(使用模板技巧訪問私人成員)
          <legend id='p3VHe'><style id='p3VHe'><dir id='p3VHe'><q id='p3VHe'></q></dir></style></legend>
              <tbody id='p3VHe'></tbody>

                <small id='p3VHe'></small><noframes id='p3VHe'>

                • <bdo id='p3VHe'></bdo><ul id='p3VHe'></ul>
                  <i id='p3VHe'><tr id='p3VHe'><dt id='p3VHe'><q id='p3VHe'><span id='p3VHe'><b id='p3VHe'><form id='p3VHe'><ins id='p3VHe'></ins><ul id='p3VHe'></ul><sub id='p3VHe'></sub></form><legend id='p3VHe'></legend><bdo id='p3VHe'><pre id='p3VHe'><center id='p3VHe'></center></pre></bdo></b><th id='p3VHe'></th></span></q></dt></tr></i><div class="acoc8gq" id='p3VHe'><tfoot id='p3VHe'></tfoot><dl id='p3VHe'><fieldset id='p3VHe'></fieldset></dl></div>
                  <tfoot id='p3VHe'></tfoot>
                  本文介紹了使用模板技巧訪問私人成員的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

                  問題描述

                  限時送ChatGPT賬號..

                  來自博客文章 訪問私人成員:更安全的骯臟 by 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;
                  }
                  

                  如何從 a 對象調用 get 函數,因為它沒有在 class A 中定義?

                  how get function can be call from a object since its not defined inside class A ?

                  我不明白為什么 get 必須有 Tag 作為參數而不是 a.*get()=> 好的,這是由于 ADL 機制

                  I don't understand why get must have Tag as parameter instead of a.*get<A_f>() => ok it's due to ADL mechanism

                  推薦答案

                  你不是從 a 調用 get!實際上返回的是一個指向 A 內部成員的類指針,它的類型是 int A::* 所以你需要一個 A 的實例> 訪問該值.

                  You are not calling get from a! Actually what get return is a class pointer to a member inside A and type of it is int A::* so you need an instance of A to access that value.

                  例如讓我玩一下你的代碼:

                  For example let me play a little with your code:

                  struct A {
                      A(int a):a(a) { }
                      int b;
                  private:
                      int a;
                  };
                  void test() {
                      auto p = &A::b;
                      std::cout << a.*p << std::endl;
                  }
                  

                  我是否從 a 內部調用了 p ?a 沒有 p,這正是你的代碼中發生的事情,get 函數返回 &A::a 然后你使用 a 來讀取它的值!就是這樣,沒有錯,我認為它會在所有編譯器中編譯.

                  Did I call p from inside a? a does not have p, this is exactly what happened in your code, get function return &A::a and you use a to read its value! that's all, nothing is wrong and I think it will be compiled in all compilers.

                  這里的另一個問題是:為什么 C++ 允許使用 A 的私有成員聲明模板.C++ 標準說:

                  One other question here is: Why C++ allow declaring template using private member of A. C++ standard say:

                  14.7.2p8 通常的訪問檢查規則不適用于用于指定顯式實例化的名稱.[注:特別是模板函數聲明器中使用的參數和名稱(包括參數類型、返回類型和異常規范)可能是通常無法訪問的私有類型或對象模板可以是成員模板或成員函數通常無法訪問.]

                  14.7.2p8 The usual access checking rules do not apply to names used to specify explicit instantiations. [Note: In particular, the template arguments and names used in the function declarator (including parameter types, return types and exception specifications) may be private types or objects which would normally not be accessible and the template may be a member template or member function which would not normally be accessible.]

                  但是,如果您嘗試實例化或什至 typedef 指定的模板,則會出現錯誤.讓我們稍微修改一下您的示例:

                  But if you try to instantiate or even typedef specified template then you get an error. Let's modify your example slightly:

                  struct A {
                  private:
                      int a;
                      friend void f();
                  };
                  
                  // Explicit instantiation - OK, no access checks
                  template struct Rob<A_f, &A::a>;
                  
                  // Try to use the type in some way - get an error.
                  struct Rob<A_f, &A::a> r;            // error
                  typedef struct Rob<A_f, &A::a> R;    // error
                  void g(struct Rob<A_f, &A::a>);      // error
                  
                  // However, it's Ok inside a friend function.
                  void f() {
                      Rob<A_f, &A::a> r;               // OK
                      typedef Rob<A_f, &A::a> R;       // OK
                  }
                  

                  這篇關于使用模板技巧訪問私人成員的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

                  【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

                  相關文檔推薦

                  Why do two functions have the same address?(為什么兩個函數的地址相同?)
                  Why the initializer of std::function has to be CopyConstructible?(為什么 std::function 的初始化程序必須是可復制構造的?)
                  mixing templates with polymorphism(混合模板與多態性)
                  When should I use the keyword quot;typenamequot; when using templates(我什么時候應該使用關鍵字“typename?使用模板時)
                  Dependent name resolution amp; namespace std / Standard Library(依賴名稱解析命名空間 std/標準庫)
                  gcc can compile a variadic template while clang cannot(gcc 可以編譯可變參數模板,而 clang 不能)

                    <bdo id='cD4N6'></bdo><ul id='cD4N6'></ul>

                      <small id='cD4N6'></small><noframes id='cD4N6'>

                      <i id='cD4N6'><tr id='cD4N6'><dt id='cD4N6'><q id='cD4N6'><span id='cD4N6'><b id='cD4N6'><form id='cD4N6'><ins id='cD4N6'></ins><ul id='cD4N6'></ul><sub id='cD4N6'></sub></form><legend id='cD4N6'></legend><bdo id='cD4N6'><pre id='cD4N6'><center id='cD4N6'></center></pre></bdo></b><th id='cD4N6'></th></span></q></dt></tr></i><div class="asuam2w" id='cD4N6'><tfoot id='cD4N6'></tfoot><dl id='cD4N6'><fieldset id='cD4N6'></fieldset></dl></div>
                      <tfoot id='cD4N6'></tfoot>
                        <tbody id='cD4N6'></tbody>

                      1. <legend id='cD4N6'><style id='cD4N6'><dir id='cD4N6'><q id='cD4N6'></q></dir></style></legend>

                          • 主站蜘蛛池模板: 上海赞永| 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 不锈钢酒柜|恒温酒柜|酒柜定制|酒窖定制-上海啸瑞实业有限公司 | 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 车辆定位管理系统_汽车GPS系统_车载北斗系统 - 朗致物联 | 报警器_家用防盗报警器_烟雾报警器_燃气报警器_防盗报警系统厂家-深圳市刻锐智能科技有限公司 | 余姚生活网_余姚论坛_余姚市综合门户网站| 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 置顶式搅拌器-优莱博化学防爆冰箱-磁驱搅拌器-天津市布鲁克科技有限公司 | 预制舱-电力集装箱预制舱-模块化预制舱生产厂家-腾达电器设备 | 蜂窝块状沸石分子筛-吸附脱硫分子筛-萍乡市捷龙环保科技有限公司 | Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 德州万泰装饰 - 万泰装饰装修设计软装家居馆 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 博莱特空压机|博莱特-阿特拉斯独资空压机品牌核心代理商 | COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 地脚螺栓_材质_标准-永年县德联地脚螺栓厂家 | 保定市泰宏机械制造厂-河北铸件厂-铸造厂-铸件加工-河北大件加工 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 好物生环保网、环保论坛 - 环保人的学习交流平台 | 合肥地磅_合肥数控切割机_安徽地磅厂家_合肥世佳电工设备有限公司 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 活性氧化铝|无烟煤滤料|活性氧化铝厂家|锰砂滤料厂家-河南新泰净水材料有限公司 | 布袋式除尘器|木工除尘器|螺旋输送机|斗式提升机|刮板输送机|除尘器配件-泊头市德佳环保设备 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 防弹玻璃厂家_防爆炸玻璃_电磁屏蔽玻璃-四川大硅特玻科技有限公司 | 四探针电阻率测试仪-振实密度仪-粉末流动性测定仪-宁波瑞柯微智能 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 |