首页 > 解决方案 > 将函数定义作为参数传递时如何理解函数定义

问题描述

我可以看到有很多语言可以在将函数作为参数传递时定义它。但是在 C++ 中有一些我无法理解的东西,这里是片段。

::android::hardware::camera::common::V1_0::Status err = ::android::hardware::camera::common::V1_0::Status::OK;
std::vector<std::string> devices;
hardware::Return<void> ret =
    hidlSecureCamera->getCameraIdList([&err, &devices](
        ::android::hardware::camera::common::V1_0::Status idStatus,
        const hidl_vec<hidl_string>& cameraDeviceIDs) {
    err = idStatus;
    if (err == Status::OK) {
        for (size_t i = 0; i < cameraDeviceIDs.size(); i++) {
            devices.push_back(cameraDeviceIDs[i]);
        }
    } });

如您所见, 的原型getCameraIdListReturn<void> SecureCamera::getCameraIdList(getCameraIdList_cb _hidl_cb)。所以它只接受一个函数作为参数。

但是,我无法理解 的含义[&err, &devices]。它们已经是之前定义的变量。所以我应该可以直接使用它,为什么我需要[&err, &devices]

标签: c++

解决方案


但是,我无法理解[&err, &devices]

你有一个 lambda 函数。

的使用[&err, &devices]表示err并由deviceslambda 函数通过引用捕获。

这可以通过使用变得更具可读性:

auto func = [&err, &devices](::android::hardware::camera::common::V1_0::Status idStatus,
                             const hidl_vec<hidl_string>& cameraDeviceIDs)
{
   err = idStatus;
   if (err == Status::OK) {
      for (size_t i = 0; i < cameraDeviceIDs.size(); i++) {
         devices.push_back(cameraDeviceIDs[i]);
      }
   }
};

hardware::Return<void> ret = hidlSecureCamera->getCameraIdList(func);

进一步阅读:https ://en.cppreference.com/w/cpp/language/lambda


推荐阅读