首页 > 编程语言 >c++11(4): 模版

c++11(4): 模版

时间:2024-07-26 13:19:15浏览次数:13  
标签:11 函数 int 模版 c++ class template memory order

constexpr常量表达式

函数:

constexpr int GetConst(){return 1;}

1): 函数体只能有单一的return返回语句
2): 函数必须有返回值(不能为void)
3): 使用前必须已定义,即函数定义写在调用函数前面(放至后面则出错)
4): return返回语句表达式中必须是一个常量表达式,且不能是运行时函数


:

constexpr int a = 1;

它是编译时期的值,编译器可以选择不为它生成数据


自定义类: 必须对构造函数加上constexpr关键词

struct MyType{
   constrxpr MyType(int x): my_int(x){}
   int my_int;
}
constexpr MyType mt  = {2};

1): 构造函数的函数体必须为空
2): 初始化列表只能由常量表达式来赋值

变长模板
template <typename T1, typename T2>
class A{};

template <typename... SomeType>
class B: private A<SomeType...>{};

B<int, char> xy;

typename之后带...来说明这是一个参数包,该包名字为SomeType
构造类型B时,会调用B的私有基类构造函数,并进行参数包展开
即实际上执行的是A<int, char> xy;


template <typename... B>
class MyClass;

template <typename A, typename... B>
class MyClass<A, B...>: private MyClass<B...>{
   A my_a;
};

template<>
class MyClass<>{};

递归定义,在参数个数为0时结束,从右往左

参数包可以展开的位置:
1): 表达式
2): 初始化列表
3): 基类描述列表
4): 类成员初始化列表
5): 模板参数列表
6): 通用属性列表
7): lambda函数的捕捉列表


template <typename... A>
class MyClass1: private OldClass<A...>{};
Myclass1 C1<X, Y>;
//解包为 class MyClass1: private OldClass<X, Y>{};

template <typename... A>
class MyClass2: private OldClass<A>...{};
Myclass2 C2<X, Y>;
//解包为 class MyClass2: private OldClass<X>, private OldClass<Y>{};

template <typename... A>
int GetSize(A... args){
   int size = sizeof...(A);    //使用sizeof...()获取参数包的大小(个数)
   return size;
}

与转发合用:......

原子操作
  1. 头文件<atomic>, <thread>
atomic_int  at1 {0};
atomic<int> at2 {0};

int Set(){
   at1 = 1;
   at2 = 2;
}
int Show(){
   cout << at1 << ", " << at2 << endl;    //可能输出(1,0)/(0,2)/(1,2)
}
int main(){
   thread t1(Set, 0);
   thread t2(Show, 0);

   t1.join();
   t2.join();
   cout << at1 << ", " << at2 << endl;    //必输出 1, 2
}

由于编译器的优化,执行时可能会打乱实际的代码顺序
所以需要显式使用原子类的成员函数写入store()和读取load()
这些函数有2个参数,第一个是值,第二个是操作类型
操作枚举值:
memory_order_relaxed不对执行顺序作保证
memory_order_acquire本线程中,所有后续的读操作必须在本条原子操作完成后执行
memory_order_release本线程中,所有之前的写操作完成之后才能执行本条原子操作
memory_order_acq_rel同时包含memory_order_acquirememory_order_release
memory_order_consume本线程中,所有后续的有关本原子类型的操作,必须在本条原子操作完成后执行
memory_order_seq_cst全部存取按照顺序执行

store()可用:
memory_order_relaxed,
memory_order_release,
memory_order_seq_cst

load()可用:
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_seq_cst

RMW(Read Modify Write)同时读写操作可用: 全部

thread_local线程局部变量
int thread_local tl;
quick_exit() / at_quick_exit()快速退出
struct A{}{
   ~A(){};
}
void Func(){}
int main(){
   A a;
   at_quick_exit(Func);      //注册一个函数,在quick_exit时FILO执行
   quick_exit(0);            //A的析构函数不执行
}
nullptr指针空值
= default = delete 默认函数
class A{
public:
   A() = default;           //使用默认构造函数, 保持POD类型
   A(const A&) = delete;    //删除该函数, 且禁止重载该函数
};
lambda函数(局部函数)
int a = 1, b = 2;
auto Func1 = [=]() -> int{
   return a + b;
};
int c = Func1();      //c = 3

auto Func2 = [](int i1, int i2) -> int{
   return i1 + i2;
}
int d = Func2(a, b);  // d = 3

[var]值传递方式捕捉变量var
[=]值传递方式捕捉所有父作用域的变量,包括this
[this]值传递方式捕捉当前this

[&var]引用传递方式捕捉变量var
[&]引用传递方式捕捉所有父作用域的变量,包括this
[&this]引用传递方式捕捉当前this

数据对齐
alignas(double) int a = 1;             //a按照double类型宽度对齐
alignas(alignof(double)) int b = 1;    //效果相同, alignof用于获取类型的宽度
通用属性
Unicode
原生字符串

参考资料: <<深入理解C++11: C++11新特性解析与应用>>

标签:11,函数,int,模版,c++,class,template,memory,order
From: https://www.cnblogs.com/redraincontrol/p/18325047

相关文章

  • windows11上MMDetection 3D环境准备
    在使用PyTorch准备环境并使用miniconda终端安装所需的所有软件包后,在验证安装过程的最后一步中出现错误。我创建了一个conda环境并激活了它,然后我安装了PyTorch以及使用MIM所需的所有软件包。MMEngineMMCVMMDetectionMMDetection......
  • C++自学笔记17(const和mutable)
    const在之前的笔记中我们出现很多次constchar*name=“shaojie”,定义一个不可变指针存放字符串。不可变就来自const,表示“只读、常量”为什么需要它呢?我们需要一些东西不可被修改。const加数据变量#include<iostream>intmain(){constintMAX_AGE=99;M......
  • C++自学笔记18(成员初始化列表和初始化对象)
    成员列表初始化创建变量,并将其初始化是创建函数的必要部分。#include<iostream>#include<string>classEntity{private:std::stringm_name;public:Entity(){m_name="nothing"}Entity(conststd::string&name){......
  • C++ primer plus 第16章string 类和标准模板库, 函数符概念
    C++primerplus第16章string类和标准模板库,函数符概念C++primerplus第16章string类和标准模板库,函数符概念文章目录C++primerplus第16章string类和标准模板库,函数符概念16.5.1函数符概念程序清单16.15functor.cpp16.5.1函数符概念正如STL定......
  • C++ primer plus 第16章string 类和标准模板库, 函数对象
    C++primerplus第16章string类和标准模板库,函数对象C++primerplus第16章string类和标准模板库,函数对象文章目录C++primerplus第16章string类和标准模板库,函数对象16.5函数对象16.5函数对象很多STL算法都使用函数对象–也叫函数符(fiunctor)。......
  • 当你第一次用C++string的assign会遇到这种情况
    当你第一次用string的assign时,会发现有一点小区别,见以下代码:stringstr1;str1.assign("helloC++");cout<<str1<<endl;stringstr2;str2.assign(str1,5);cout<<str1<<endl;stringstr3;str3.assign("helloC++",5);cout<<......
  • 使用pybind11封装c++的dll,供python调用
    用pip安装好pybind11 文件清单,都写在一个目录里//文件名:add.cppextern"C"doubleadd(doublein1,doublein2){returnin1+in2;}//文件名:sub.cppextern"C"doublesub(doublein1,doublein2){returnin1-in2;}//文件名:mul.cppextern"......
  • P9304 「DTOI-5」3-1题解,c++树的遍历例题
    题意给定以n(1≤n≤1......
  • C/C++默认生成的几个函数s
    一、关键词类/结构体默认生成。拷贝/移动+构造/赋值=组合不同方式有4种,除默认、析构,共计6种。在使用时:拷贝/移动+赋值的,都是定义和赋值分开;拷贝/移动+构造的,都是定义和赋值一起。二:知识点默认构造函数Student():age(0){};拷贝构造函数Student(constStudent&i......
  • C++ typeid 关键字的注意事项
    typeid 是C++的一个关键字,用于动态类型获取。typeid 运算符与RTTI(运行时类型信息)密切相关,它返回一个指向 std::type_info 对象的引用,该对象表示了表达式的类型。使用 typeid 时,需要注意以下几个方面:需要#include <typeinfo>头文件:要使用 typeid,应在代码中包含 <t......