引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针

简介:  1、引用内部函数绑定机制 #include<iostream> #include<functional>   usingnamespacestd; usingnamespacestd::placeholders;   //仿函数,创建一个函数指针,引用一个结构体内部或者一个类内部的共有函数 structMy


1、引用内部函数绑定机制

#include<iostream>

#include<functional>

 

usingnamespacestd;

usingnamespacestd::placeholders;

 

//仿函数,创建一个函数指针,引用一个结构体内部或者一个类内部的共有函数

structMyStruct

{

   voidadd(inta)

   {

       cout <<a <<endl;

   }

   voidadd2(inta,intb)

   {

       cout <<a +b <<endl;

   }

   voidadd3(inta,intb,intc)

   {

       cout <<a +b +c <<endl;

   }

};

 

voidmain()

{

   MyStructstruct1;

   //auto自动变量,地址,函数指针,bind绑定

   //第一个参数引用内部函数,绑定一个实体对象

   //这里后面的_1等为占位用

   autofunc =bind(&MyStruct::add, &struct1,_1);

   autofunc2 =bind(&MyStruct::add2, &struct1,_1,_2);

   autofunc3 =bind(&MyStruct::add3, &struct1,_1,_2,_3);

   func(100);

   func2(10, 20);

   func3(10, 20, 30);

 

   cin.get();

}

 

voidmain1()

{

   //如果想通过另外一种方式获得结构体中的函数,还可以通过下面的方式

   MyStructstruct1;

   //创建函数指针,类结构体,数据私有,代码共享

   //函数通过调用,调用需要传递对象名进行区分

   void(MyStruct::*p)(inta) = &MyStruct::add;

   

   cin.get();

}

补充:Cocos2dx中关于std::function和bind的用法案例:

#include "T01CPP11.h"

 

void foo()

{

    CCLog("foo is called\n");

}

 

void funArg3(int n,char c,float f)

{

    CCLog("%d,%c,%f",n,c,f);

}

 

void T01CPP11::mFoo()

{

    CCLog("mFoo is called");

}

 

//关于lambda表达式

bool T01CPP11::init()

{

    Layer::init();

   

    //std::function;

    //std::bind

 

    //函数指针类型

    std::function<void()> func = foo;

    func();

 

    //成员函数指针的赋值和调用

    {

        //注意在::域作用符后面加上*

        void(T01CPP11::*FuncPtr)() = &T01CPP11::mFoo;

        //调用成员函数的时候加上this

        (this->*FuncPtr)();

    }

 

    //bind的功能,就是把一个具体函数,编程std::function对象

    //bind可以把具体函数和std::function形式完全改变,比如参数数量的改变

    {

        std::function<void()> func = std::bind(funArg3, 100, 'c', 0.1f);

        func();

    }

 

    //也可以改变参数顺序

    {

        //其中

        //_1:表示function<void(float, char, int)>括号中的第一个参数

        //_2:表示function<void(float, char, int)>括号中的第二个参数

        //_3:表示function<void(float, char, int)>括号中的第三个参数

        //后面3个占位符分别在funArg3中的顺序,而又用标记来代表上面括号中参数的的位置

        std::function<void(float, char, int)> func = std::bind(funArg3,

            std::placeholders::_3, std::placeholders::_2, std::placeholders::_1);

        func(1.0f, 'd', 2000);

    }

 

    // 也可以同时改变参数个数和顺序

    {

        std::function<void(float, char)> func = std::bind(funArg3,

            100, std::placeholders::_2, std::placeholders::_1);

        func(4.0f, 'x');

    }

 

    //也可以绑定成员函数

    {

        std::function<void()> func = std::bind(&T01CPP11::mFoo, this);

        func();

    }

 

    return true;

}

 


2.通过R”()”的方式实现转义字符

#include<iostream>

#include<string>

#include<stdlib.h>

 

voidmain()

{

   std::stringpath =R"( "C:\Program Files\Tencent\QQ\QQProtect\Bin\QQProtect.exe")";

   //通过R"()" 括号之间去掉转义字符

   system(path.c_str());

   system("pause");

}

3.引用

#include<iostream>

 

template<classT>

voidcom(Targ) //模板函数,引用无效,引用包装器

{

   std::cout << "com =" << &arg << "\n";

   arg++;

}

 

voidmain()

{

   intcount = 10;

   int &rcount =count;

   com(count);

   std::cout << count <<std::endl;

   //std::ref(变量),函数模板,引用包装器

   //com(std::ref(count));

   com(rcount);

   std::cout << "main=" << &rcount << "\n";

   std::cout << count <<std::endl;

   std::cin.get();

}

4.C++别名

#include<iostream>

 

namespacespace{ //隔离模板,避免冲突

   template<classT>usingprt =T*;//模板的简写,定义一个模板的指针

}

 

intadd(inta,intb)

{

   returna +b;

}

 

//typedefC语言中定义别名的关键字

typedef int(*ADD)(inta,intb);

//C++中的别名是通过using关键字实现的

usingFUNC =int(*)(inta,intb);

usingco =std::ios_base::fmtflags;

 

voidmain()

{

   ADDp =add;

   std::cout << p(1, 2) <<std::endl;

   FUNCfunc =add;

   std::cout << func(1, 2) <<std::endl;

   //space::ptr<int> pint(new int(15));

   //std::cout << *pint << "  " << pint << std::endl;

   std::cin.get();

}

5.模板元

#include<iostream>

 

//主要思想

//

//利用模板特化机制实现编译期条件选择结构,利用递归模板实现编译期循环结构,模板元程序则由编译器在编译期解释执行。

//

//优劣及适用情况

//

//通过将计算从运行期转移至编译期,在结果程序启动之前做尽可能多的工作,最终获得速度更快的程序。也就是说模板元编程的优势在于:

//

//1.以编译耗时为代价换来卓越的运行期性能(一般用于为性能要求严格的数值计算换取更高的性能)。通常来说,一个有意义的程序的运行次数(或服役时间)总是远远超过编译次数(或编译时间)。

//

//2.提供编译期类型计算,通常这才是模板元编程大放异彩的地方。

//

//模板元编程技术并非都是优点:

//

//1.代码可读性差,以类模板的方式描述算法也许有点抽象。

//

//2.调试困难,元程序执行于编译期,没有用于单步跟踪元程序执行的调试器(用于设置断点、察看数据等)。程序员可做的只能是等待编译过程失败,然后人工破译编译器倾泻到屏幕上的错误信息。

//

//3.编译时间长,通常带有模板元程序的程序生成的代码尺寸要比普通程序的大,

//

//4.可移植性较差,对于模板元编程使用的高级模板特性,不同的编译器的支持度不同。

 

//模板元吧运行时消耗的时间,在编译期间优化

template<intN>

structdata

{

   enum {res =data<N - 1>::res +data<N - 2>::res };

};

 

//当为1的情况

template<>

structdata<1>

{

   enum {res = 1};

};

 

template<>

structdata<2>

{

   enum {res = 1 };

};

 

intgetdata(intn)

{

   if (n == 1 ||n == 2)

   {

       return 1;

   }

   else

   {

       returngetdata(n - 1) + getdata(n - 2);

   }

}

 

voidmain()

{

   constintmyint = 40;

   intnum =data<myint>::res;//<>内部不可以有变量

   std::cout << num <<std::endl;

   std::cout << getdata(40) <<std::endl;

 

   std::cin.get();

}

运行结果相同,但是后者明显速度要慢于前者。

6.

#include<stdio.h>

#include<assert.h>

#include<iostream>

 

usingnamespacestd;

#define N 10

voidmain()

{

   intnum = 100;

   cout <<num <<endl;

   //本文件所在的文件路径

   cout <<__FILE__ <<endl;

   //下一行代码在文件中的行位置

   cout <<__LINE__ <<endl;

   //日期

   cout <<__DATE__ <<endl;

   //日期

   cout <<__TIME__ <<endl;

   //当前函数名称

   cout << __FUNCTION__ <<endl;

 

   cin.get();

}

7.断言调试

这时候没有输入东西

8.C++中的多线程

#include<thread>

#include<iostream>

#include<windows.h>

#include<vector>

 

usingnamespacestd;

usingnamespacestd::this_thread;

 

voidmsg()

{

   MessageBoxA(0,"12345","678910",0);

}

 

voidmsgA(intnum)

{

   std::cout << get_id() <<" num = " <<num <<std::endl;

}

 

voidmain()

{

   // thread::hardware_concurrency线程

   auton =thread::hardware_concurrency();//获得当前核心数

   std::cout << n <<std::endl;

   //获取当前线程编号

   std::cout << "thread = " <<get_id() <<std::endl;

 

   threadthread1(msg);//创建多线程

   threadthread2(msg);

   thread1.join();//开始执行

   thread2.join();

 

   std::cin.get();

}

截图如下:

9.多线程

#include<thread>

#include<iostream>

#include<windows.h>

#include<vector>

usingnamespacestd;

usingnamespacestd::this_thread;

voidmsg()

{

   MessageBoxA(0,"12345","678910",0);

}

voidmsgA(intnum)

{

   std::cout << get_id() <<" num = " <<num <<std::endl;

}

voidmain()

{

   vector<thread *> threads;

   for (inti = 0;i < 10;i++)

   {

       threads.push_back(newthread(msg));//创建线程

   }

   for (autoth :threads)

   {

       th->join();

   }

   std::cin.get();

}

10.线程间通信

#include<thread>

#include<iostream>

#include<windows.h>

#include<vector>

 

usingnamespacestd;

usingnamespacestd::this_thread;

 

voidmsgA(intnum)

{

   std::cout << get_id() <<" num = " <<num <<std::endl;

}

 

voidmain()

{

   vector<thread *> threads;

   for (inti = 0;i < 10;i++)

   {

       //其中后面的msgA为函数名,i为为函数传递的参数

       threads.push_back(newthread(msgA,i));//创建线程

   }

 

   for (autoth :threads)

   {

       th->join();

   }

   std::cin.get();

}

程序运行结果如下:

11.C++中的智能指针

#include<iostream>

#include<memory>//内存

 

voidmain()

{

   for (inti = 0;i < 10000000;i++)

   {

       //新型指针,新型的数组

       std::unique_ptr<double>pdb(newdouble);

       //通过指针执行来自动释放内存

 

       //double *p = new double;

   }

 

   std::cin.get();

}

12.另外一种智能指针

#include<iostream>

voidmain()

{

   //auto_prt

   for (inti = 0;i < 10000000;i++)

   {

       double *p =newdouble;//为指针分配内存

       std::auto_ptr<double>autop(p);

       //创建智能指针管理指针p指向内存

       //智能指针

       //delete p;

   }

   std::cin.get();

}

目录
相关文章
|
2月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
6月前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
209 0
|
6月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
162 0
|
9月前
|
编译器 C++
模板(C++)
本内容主要讲解了C++中的函数模板与类模板。函数模板是一个与类型无关的函数家族,使用时根据实参类型生成特定版本,其定义可用`typename`或`class`作为关键字。函数模板实例化分为隐式和显式,前者由编译器推导类型,后者手动指定类型。同时,非模板函数优先于同名模板函数调用,且模板函数不支持自动类型转换。类模板则通过在类名后加`&lt;&gt;`指定类型实例化,生成具体类。最后,语录鼓励大家继续努力,技术不断进步!
|
9月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
476 6
|
10月前
|
编译器 C++
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
|
10月前
|
安全 C++
【c++】模板详解(2)
本文深入探讨了C++模板的高级特性,包括非类型模板参数、模板特化和模板分离编译。通过具体代码示例,详细讲解了非类型参数的应用场景及其限制,函数模板和类模板的特化方式,以及分离编译时可能出现的链接错误及解决方案。最后总结了模板的优点如提高代码复用性和类型安全,以及缺点如增加编译时间和代码复杂度。通过本文的学习,读者可以进一步加深对C++模板的理解并灵活应用于实际编程中。
144 0
|
10月前
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
391 4
|
2月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
149 6

热门文章

最新文章