C++17 Qt 使用標準庫綁定可變參數包的sql query語句

主要思路是使用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章