std::bind

(锁模板, 钥匙):把 “锁 + 钥匙” 打包成一个 “无需钥匙就能直接用的新工具”(新的可调用对象)。返回类型 = 被绑定函数的返回类型

std::bind(函数对象, 参数1, 参数2, ...);
std::function<返回值类型(参数类型1, 参数类型2, ...)> 变量名;
int multiply(int a, int b) {
    return a * b;
}
int compute(int a,int b,function<int(int,int)> func){
    return func(a,b);
}
int main() {
    cout << "3*5=" << compute(3, 5, multiply) << endl; // 输出:15
    return 0;
}
struct RuleMatch {
	std::function<bool(const QString & value)> matchFunc;
	QString value;
};			
std::function<bool(const QString&)> matchFunc = [field, sql, value](const QString & target)->bool{
				if (field == "备注") {
					if (sql == "包含") return target.contains(value);
					else if (sql == "等于") return target == value;
					else if (sql == "开头") return target.startsWith(value);
					else if (sql == "结尾") return target.endsWith(value);
				}
				return false;
			};

占位符和宏

格式符 作用 示例 输出结果
%d 输出十进制 int 整数 printf("%d", 123) 123
%f 输出浮点数(float/double) printf("%f", 3.14) 3.140000
%s 输出字符串 printf("%s", "Qt") Qt
%c 输出单个字符 printf("%c", 'A') A
%x 输出十六进制整数 printf("%x", 10) a

\n:换行符(转义字符)\t:制表符(相当于按 Tab 键);

\\:输出反斜杠本身;\":输出双引号本身。

__FUNCTION__(注意是两个下划线开头和结尾)是 C/C++ 编译器提供的预定义宏,核心作用是:在代码编译时,自动替换为当前函数的函数名字符串——

宏名 核心作用 数据类型 适用范围
__FILE__ 替换为当前代码所在源文件的完整路径字符串(如D:/code/demo/main.cpp const char* 全局有效(函数内 / 外都能用)
__LINE__ 替换为当前代码所在的行号整数(如 15、28) int

全局有效

指针函数和函数指针

// 指针函数也是函数,只是返回值是指针, 返回值不能是局部变量地址
int * func()
{
    int a = 10; 
    return &a;
}
// 函数指针:是一个指针,指向函数的指针
// 函数返回类型(*函数指针名)(参数列表)
// 回调函数 
#include <iostream>
#include <thread>
#include <Windows.h>
using namespace std;
void thread_func(int num){
    while(true){
        printf("%s %d\n",__FUNCTION__ ,num);
        Sleep(1000);
    }
}
int main() {
    thread thr(thread_func,100);
    while(true){
        printf("%s %d\n",__FUNCTION__ ,200);
        Sleep(1000);
    }
    return 0;
}
// 设计中比如排序,函数中要先执行一个函数,就把函数作为函数指针传入,先去执行该函数
int pfunc(){
    printf("%s",__FUNCTION__);
    return 20;
}
int main(int argc, char *argv[]) {
    int (*funName)() = pfunc;
    funName();
    return 0;
}

程序中设计模块时,先设计每个类的接口,可以用伪代码的形式,再去一个个实现

define和using

#define     宏名(参数)        替换文本

#define ICASES_CONVERT(X) qSharedPointerCast<ICaseService>(X)

using qSharedPointerCast<ICaseService>(X) = ICASES_CONVERT(X)

#define ADD(a, b) (a + b)

空的虚析构函数

virtual ~IFrameCore() = default;
virtual ~IFrameCore() {}

=default 和 {} 功能完全一样

风格上 =default 更现代、更规范

C++ 会自动生成默认构造函数,接口类不需要手动写

  • 顶层接口析构必须是 virtual
  • 中间接口不需要写析构(自动继承虚属性)
  • 最终插件类析构写 override 即可
IJatPluginService(顶层父接口)
        ↑
IAuthorizationService(子接口)      //推荐不写,因为会自动继承父类的虚析构!
        ↑
AuthorizationPlugin(最终插件类)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐