【问题标题】:Creating a template with an operation and a data type c++创建具有操作和数据类型 c++ 的模板
【发布时间】:2021-06-28 04:02:43
【问题描述】:

在我的项目中,有两个地方使用了类似的代码。我想创建一个模板来避免这种代码重复。 这是第一种情况:

IAsyncOperation<GattCharacteristicsResult> charListResult = service.GetCharacteristicsAsync();
while (charListResult.Status() != AsyncStatus::Completed) {
    continue;
}
GattCharacteristicsResult charListR = charListResult.GetResults();

这是第二种情况:

IAsyncOperation<GattDescriptorsResult> discrOper = characteristic.GetDescriptorsAsync();
while (discrOper.Status() != AsyncStatus::Completed) {
    continue;
}
GattDescriptorsResult descrR = discrOper.GetResults();

我能做到的最多是:

template<class Operation>
GattCharacteristicsResult getNested1(Operation operation) {
    IAsyncOperation<GattCharacteristicsResult> result = operation();
    while (result.Status() != AsyncStatus::Completed) {
        continue;
    }
    return result.GetResults();
}

相应地,使用模板:

attCharacteristicsResult charListR = getNested1([&service]() { return service.GetCharacteristicsAsync(); });

但这还不够。我需要摆脱“GattCharacteristicsResult”。有什么想法吗?

【问题讨论】:

  • IAsyncOperation 没有 Wait 函数或类似函数。积极的等待让我很困扰。
  • 当然,主动等待并不好。但是主线程不能等待(最后我在尝试 co_await 时出错)。所以,对于那个例子,我就是这样做的。

标签: c++ templates lambda


【解决方案1】:

我猜你也可以模板化返回类型,然后在调用中明确指定它:

template<class ResultType, class Operation>
ResultType getNested1(Operation operation) {
    IAsyncOperation<ResultType> result = operation();
    while (result.Status() != AsyncStatus::Completed) {
        continue;
    }
    return result.GetResults();
}

auto charListR = getNested1<GattCharacteristicsResult>(...);

或者只使用 auto 让编译器推断出必要的类型:

template<class Operation>
decltype(auto) getNested1(Operation operation) {
    auto result = operation();
    while (result.Status() != AsyncStatus::Completed) {
        continue;
    }
    return result.GetResults();
}

我现在手头没有编译器,所以我不确定上述方法是否有效,但您可以尝试一下。

【讨论】:

  • 非常感谢。在第一个示例中,您有一个小错字: template 如果可以,请更正它,突然间它会对某人派上用场。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 2014-09-16
  • 2020-01-05
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多