C ++将函数调用列表作为参数传递

问题描述

我目前正在建立一个单元测试帮助程序类,该类在Qt中使用C ++ 11进行验证,以验证在不知其顺序的测试过程中是否发出了信号,例如:

void TestUtils::verifyVolumeAdjustment(const QSignalSpy &vol_spy,uint percent)
{
    for(QList<QVariant> vol_call_args : vol_spy){
        if(vol_call_args.at(0).toInt() == percent)
        {
            return;
        }
    }
    QString err = QString("volume never set to %1").arg(QString::number(percent));
    QFAIL(err.toLocal8Bit().constData());
}

我有很多这样的功能,用于检查是否发出了某些信号。现在,我需要在顺序很重要的地方编写测试。在这些测试中,我需要验证例如:

Volume set to 10
Volume set to 50

但完全按此顺序。现在我的问题是,是否可以使用可变参数模板或类似的方法将函数调用列表传递给函数。我想象通用顺序检查功能是这样的:

void checkExecutionOrder(const QSignalSpy& spy,FunctionCallList call_list){
    
    for(int i = 0; i < call_list.length(),i++){
         QSignalSpy temp;
         temp.append(spy.at(i)); //create a temporary copy of that caught signal to ensure its the only thing validated
         call_list[i].call(temp,arguments); // call the function from the list with modified spy and remaining arguments
    }
}

有什么好方法可以做到,所以我不必为每个函数创建一个顺序敏感的测试函数吗?

解决方法

另一个选择是使用lambda。 方法如下:

  1. 定义采用列表的方法,向量为std::functions
  2. 在方法内部进行for循环并调用每个函数
  3. 调用该方法传递一个填充有lambda的向量,称为...

void myFooFunction(QVector<std::function<int(int)>>& myVec)
{
    for(auto& x:myVec)
    {
        x(1);
    }
}

int main(int argc,char* argv[])
{

    QVector<std::function<int(int)>> x;
    auto f1 = [](int x){qDebug() << "x ++" << x; return x++;};
    auto f2 = [](int x){qDebug() << "x --" << x; return x--;};
    x.push_back(f1);
    x.push_back(f2);
    myFooFunction(x);
,

您可以使用 SELECT o.*,(SELECT name FROM projects WHERE ProjectID = o.ProjectID) as Name FROM orders o order by OrderID desc INNER JOIN order_items oi ON oi.ORDERID = o.ORDERID INNER JOIN order_acceptance_comments oac ON oac.ORDER_ID = o.ORDERID WHERE order_item_id = 1 std::vector将具有相同签名的功能列表传递给std::function

checkExecutionOrder

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...