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

<legend id='vc9gr'><style id='vc9gr'><dir id='vc9gr'><q id='vc9gr'></q></dir></style></legend>
    <bdo id='vc9gr'></bdo><ul id='vc9gr'></ul>
<i id='vc9gr'><tr id='vc9gr'><dt id='vc9gr'><q id='vc9gr'><span id='vc9gr'><b id='vc9gr'><form id='vc9gr'><ins id='vc9gr'></ins><ul id='vc9gr'></ul><sub id='vc9gr'></sub></form><legend id='vc9gr'></legend><bdo id='vc9gr'><pre id='vc9gr'><center id='vc9gr'></center></pre></bdo></b><th id='vc9gr'></th></span></q></dt></tr></i><div class="9xlnvln" id='vc9gr'><tfoot id='vc9gr'></tfoot><dl id='vc9gr'><fieldset id='vc9gr'></fieldset></dl></div>

    1. <tfoot id='vc9gr'></tfoot>

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

        將 lambda 傳遞給函數模板

        Passing a lambda into a function template(將 lambda 傳遞給函數模板)

            • <small id='C2Vjc'></small><noframes id='C2Vjc'>

              <legend id='C2Vjc'><style id='C2Vjc'><dir id='C2Vjc'><q id='C2Vjc'></q></dir></style></legend>

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

                  <tbody id='C2Vjc'></tbody>
                • <bdo id='C2Vjc'></bdo><ul id='C2Vjc'></ul>

                  本文介紹了將 lambda 傳遞給函數模板的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

                  問題描述

                  限時送ChatGPT賬號..

                  我正在學習 C++,我正在嘗試實現一個二分查找函數,該函數查找謂詞所包含的第一個元素.該函數的第一個參數是一個向量,第二個參數是一個計算給定元素謂詞的函數.二分查找函數如下所示:

                  I'm learning C++, and I'm trying to implement a binary search function that finds the first element for which a predicate holds. The function's first argument is a vector and the second argument is a function that evaluates the predicate for a given element. The binary search function looks like this:

                  template <typename T> int binsearch(const std::vector<T> &ts, bool (*predicate)(T)) {
                      ...
                  }
                  

                  如果這樣使用,它會按預期工作:

                  This works as expected if used like this:

                  bool gte(int x) {
                      return x >= 5;
                  }
                  
                  int main(int argc, char** argv) {
                      std::vector<int> a = {1, 2, 3};
                      binsearch(a, gte);
                      return 0;
                  }
                  

                  但是如果我使用 lambda 函數作為謂詞,我會得到一個編譯器錯誤:

                  But if I use a lambda function as a predicate, I get a compiler error:

                  search-for-a-range.cpp:20:5: error: no matching function for call to 'binsearch'
                      binsearch(a, [](int e) -> bool { return e >= 5; });
                      ^~~~~~~~~
                  search-for-a-range.cpp:6:27: note: candidate template ignored: could not match 'bool (*)(T)' against '(lambda at
                        search-for-a-range.cpp:20:18)'
                  template <typename T> int binsearch(const std::vector<T> &ts,
                                            ^
                  1 error generated.
                  

                  以上錯誤是由

                  binsearch(a, [](int e) -> bool { return e >= 5; });
                  

                  怎么了?為什么編譯器不相信我的 lambda 有正確的類型?

                  What's wrong? Why is the compiler not convinced that my lambda has the right type?

                  推薦答案

                  你的函數 binsearch 接受一個函數指針作為參數.lambda 和函數指針是不同的類型:可以將 lambda 視為實現 operator() 的結構體實例.

                  Your function binsearch takes a function pointer as argument. A lambda and a function pointer are different types: a lambda may be considered as an instance of a struct implementing operator().

                  請注意,無狀態 lambda(不捕獲任何變量的 lambda)可隱式轉換為函數指針.由于模板替換,這里隱式轉換不起作用:

                  Note that stateless lambdas (lambdas that don't capture any variable) are implicitly convertible to function pointer. Here the implicit conversion doesn't work because of template substitution:

                  #include <iostream>
                  
                  template <typename T>
                  void call_predicate(const T& v, void (*predicate)(T)) {
                      std::cout << "template" << std::endl;
                      predicate(v);
                  }
                  
                  void call_predicate(const int& v, void (*predicate)(int)) {
                      std::cout << "overload" << std::endl;
                      predicate(v);
                  }
                  
                  void foo(double v) {
                      std::cout << v << std::endl;
                  }
                  
                  int main() {
                      // compiles and calls template function
                      call_predicate(42.0, foo);
                  
                      // compiles and calls overload with implicit conversion
                      call_predicate(42, [](int v){std::cout << v << std::endl;});
                  
                      // doesn't compile because template substitution fails
                      //call_predicate(42.0, [](double v){std::cout << v << std::endl;});
                  
                      // compiles and calls template function through explicit instantiation
                      call_predicate<double>(42.0, [](double v){std::cout << v << std::endl;});
                  }
                  

                  <小時>

                  你應該讓你的函數 binsearch 更通用,比如:

                  template <typename T, typename Predicate>
                  T binsearch(const std::vector<T> &ts, Predicate p) {
                  
                      // usage
                  
                      for(auto& t : ts)
                      {
                          if(p(t)) return t;
                      }
                  
                      // default value if p always returned false
                  
                      return T{};
                  }
                  

                  從標準算法庫中汲取靈感.

                  這篇關于將 lambda 傳遞給函數模板的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持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='1MyB5'></bdo><ul id='1MyB5'></ul>
                    • <tfoot id='1MyB5'></tfoot>

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

                            <small id='1MyB5'></small><noframes id='1MyB5'>

                              <tbody id='1MyB5'></tbody>
                            <legend id='1MyB5'><style id='1MyB5'><dir id='1MyB5'><q id='1MyB5'></q></dir></style></legend>
                          2. 主站蜘蛛池模板: 偏心半球阀-电动偏心半球阀-调流调压阀-旋球阀-上欧阀门有限公司 | 煤棒机_增碳剂颗粒机_活性炭颗粒机_木炭粉成型机-巩义市老城振华机械厂 | 吹塑加工_大型吹塑加工_滚塑代加工-莱力奇吹塑加工有限公司 | 100国际学校招生 - 专业国际学校择校升学规划 | 净化工程_无尘车间_无尘车间装修-广州科凌净化工程有限公司 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 自动螺旋上料机厂家价格-斗式提升机定制-螺杆绞龙输送机-杰凯上料机 | 磁棒电感生产厂家-电感器厂家-电感定制-贴片功率电感供应商-棒形电感生产厂家-苏州谷景电子有限公司 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | 砂尘试验箱_淋雨试验房_冰水冲击试验箱_IPX9K淋雨试验箱_广州岳信试验设备有限公司 | DNA亲子鉴定_DNA基因检测中心官方预约平台-严选好基因网 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 超声波分散机-均质机-萃取仪-超声波涂料分散设备-杭州精浩 | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 | 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 购买舔盐、舔砖、矿物质盐压块机,鱼饵、鱼饲料压块机--请到杜甫机械 | 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 橡胶弹簧|复合弹簧|橡胶球|振动筛配件-新乡市永鑫橡胶厂 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 常州减速机_减速机厂家_常州市减速机厂有限公司 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 上海质量认证办理中心 | 彼得逊采泥器-定深式采泥器-电动土壤采样器-土壤样品风干机-常州索奥仪器制造有限公司 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 自动配料系统_称重配料控制系统厂家 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 活性炭-蜂窝-椰壳-柱状-粉状活性炭-河南唐达净水材料有限公司 | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 模具ERP_模具管理系统_模具mes_模具进度管理_东莞市精纬软件有限公司 | 电动葫芦|环链电动葫芦-北京凌鹰名优起重葫芦 | 塑料托盘厂家直销-吹塑托盘生产厂家-力库塑业【官网】 | 淘趣英语网 - 在线英语学习,零基础英语学习网站 | 干式磁选机_湿式磁选机_粉体除铁器-潍坊国铭矿山设备有限公司 |