C++11笔记

  • xCode中开启c++11支持:

      Build Settings -> C++ Language Dialect 选 C++11
                     -> C++ StandardLibrary 选 libc++
  • lambda:

    语法: [capture-list](args-list) ->return-type {…}

    可转类型:function<return-type (args-type-list)>

    • lambda的类型是实现了operator()的匿名类型,可转成std::function<>,但不是std::function<>,因此

        template<typename ...Args>
        void call(Args&& ...args) { std::cout << "call 1"; }
        template<typename ...Args>
        void call(std::function<void ()>, Args&& ...args) { std::cout << "call 2"; }

      调用call([](){});输出call 1,而不是call 2

      要输出call 2,函数调用时要显式将lambda参数转成std::function类型:

        call(std::function<void ()>([](){}))
  • range-based for:

    遍历map:

      for (auto& kv : aMap) {
          cout << kv.first << " has value " << kv.second << endl;
      } 

    非成员函数的begin()end():要定义在CustomClass所在的namespace中

  • 取tuple中第i个元素:std::get<i>(tuple)

  • string和number间互转:

      string to_string(int val);
      string to_string(float val);
      …
      int stoi(const string& str, size_t *idx=0, int base=10);
      float stof(const string& str, size_t *idx=0);
      …
  • unique_ptr使用自定义deleter,例如:

      template<typename T>
      using cc_unique_ptr = std::unique_ptr<T, std::function<void(void *)>>;
      template<typename T>
      cc_unique_ptr<T> make_unique(T *ptr) {
          if (ptr) ptr->retain();
          auto deleter = [](void *p) {
              auto ptr = static_cast<T *>(p);
              if (ptr) ptr->release();
          };
          return cc_unique_ptr<T>(ptr, deleter);
      }
  • 为enum指定underlying type: enum E : short { kValue1, kValue2, ... },然后可以使用forward declare: enmu E : short;

  • 强类型enum用关键字enum class声明,其枚举值不会暴露在surrounding scope

      enum class Options {None, One, All};
      Options o = Options::All;
  • 可给函数方法添加后置标识符override(指明某函数重载父类函数)和final(指明某函数不能被子类重载)

  • 支持正则表达式<regex>

参考