C++ template模板使用记录

【背景】

写一个类成员方法,封装编程中对数据库的更新、插入操作。

我的数据库操作代码中的变量有两个:(1)sql语句;(2)addBindValue的变量,同时变量数量也是不定的,所以我需要使用template来表示这一不定参数

下面先逐条记录一下过程中遇到的问题及解决方案,再附上参考代码。

【问题及解决方案】

  1. “无法解析外部符号”
    描述:我将方法声明在.h头文件,实现在.cpp文件,但是识别不到方法
    解决:模板的声明和定义通常要一同放在头文件中
     
  2. "未找到匹配的重载函数bind"
    描述:我在bind方法中实现对template agrs的遍历,以绑定各个变量到sql,但报错显示我少了bind的重载
    解决:在遍历到args最后一个元素时,需要调用bind重载函数,参数会发生变化,具体见下方代码
     
  3. “没有与参数列表匹配的函数模板”
    描述:在主函数调用时报错,查看了很多博文,说到是实例化模板的问题,搞不懂这个
    解决
    我仔细检查了自己的代码,我的形参都以&形式引用变量名,但实参中有常量,所以导致参数不一致。
    因为我并不对传入的变量进行改动,所以我将方法形参中的“&”都删去,问题解决。

【代码】

.h文件

#include <qstring.h>
#include <qsqlquery.h>
class PostProcess
{
public:
	PostProcess();
	~PostProcess();

	template<class T, class ...Args>
	void bind(QSqlQuery sql_q, T val, Args ...args);

	template<class T>
	void bind(QSqlQuery sql_q, T val);

	template<typename ...Args>
	void database_operate(QString s, Args ...args);

};

//模板类的实现和声明需要一同写入到头文件中
template <class T, class ...Args>
void PostProcess::bind(QSqlQuery sql_q, T val, Args... args)
{
	sql_q.addBindValue(val);
	bind(sql_q, args...);
}

// 当可变参数列表只剩下一个参数时,调用重载版本
template<class T>
void PostProcess::bind(QSqlQuery sql_q, T val) {
	sql_q.addBindValue(val);
}

//sql语句向数据库插入/更新数据
template<typename... Args>
void PostProcess::database_operate(QString s, Args... args)
{
	QSqlQuery sql_q = QSqlQuery();
	sql_q.prepare(s);
	bind(sql_q, args...);
    sql_q.exec();
}

.cpp

#include "PostProcess.h"

PostProcess::PostProcess()
{
}

PostProcess::~PostProcess()
{
}

【参考博文】

函数模板 | 现代 C++ 模板教程 (mq-b.github.io)

20200403 - 模板函数实现和声明必须在同一个头文件里_模板和实现可不可以不写在一个文件里面-CSDN博客

遍历 “可变参数模板” 的模板参数_遍历可变参数-CSDN博客

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值