主要思路是使用std::forward_as_tuple將參數包保存到元組中,然後利用std::apply遍歷元組中的數據
這裏需要用到auto類型推斷,如果參數中有自定義類型還需要註冊元對象系統
最後在apply中使用摺疊表達式展開參數包(xxxx(args), …)並逐一處理
template<typename... Args>
/*static*/ void prepare(std::string stat, Args&&... args) {
QSqlQuery query(m_db);
query.prepare(stat.data());
auto a = std::forward_as_tuple(args...);
std::apply([&query, this](auto&&... args) {
((query.addBindValue(QVariant::fromValue(args)), std::cout << args), ...);
}, a);
query.exec();
query.lastError().text().isEmpty()?
std::cerr << "\nsuccess":
std::cerr << "\nfailed";
}
單元測試
class Test {
public:
Test() = default;
explicit Test(int a):m_a(a) {}
friend const std::ostream& operator<< (
std::ostream &os,
const Test &t
) {
(void)t.m_a;
return os << "test";
}
private:
int m_a = 0;
};
Q_DECLARE_METATYPE(Test)
void TestCompileArglistQuery() {
auto f =3;
QVariant d;
qDebug() << d.fromValue(f);
qDebug() << d;
ORMHelper().prepare("UPDATE USER", 0, 2, Test(0), 4, 5);
}
執行結果
QVariant(int, 3)
QVariant(Invalid)
02test45
failed