【问题标题】:Extracting element with specific type from string with generic lambda从具有通用 lambda 的字符串中提取具有特定类型的元素
【发布时间】:2017-08-04 14:33:04
【问题描述】:

我正在使用 C++。我有一个字符串,它可以包含以^ 开头并以$ 结尾的元素。该元素可以是intstring

示例:

"....^15$asdasd"-> 15
"...^bbbb$ccc"->"bbbb"

我想编写 lambda 函数来执行此操作。 如果我使用模板函数,代码将如下所示:

template <typename T>
T getElem(string S)
{
     T retElem;
     // make calculations
     // ....
     return retElem;
}

但是当我尝试使用通用 lambda 时,我遇到了这种情况:

auto getElem = [] () {
     T retElem;
     // make calculations
     // ....
     return retElem;
};

问题是如何获取 retElem 的类型。在这种情况下有没有办法使用 lambda。我想在使用这种提取的函数中使用通用 lambda。我只想把这个逻辑封装在函数中。

【问题讨论】:

  • 为什么要使用 lambda?你的函数模板有什么问题?

标签: c++ c++14 generic-lambda


【解决方案1】:

通用 lambda 必须具有(模板化)类型的参数,您不能在非参数上模板化通用 lambda。解决问题的最简单方法是提供给定类型的虚拟参数。如:

template<class T>
struct identity { using type = T; };
...
auto lam = [](auto the_type) {
    using T = typename decltype(the_type)::type;
    ...
};
...
lam(identity<T>{});
...

【讨论】:

  • SergayA 这是个好建议。我的目的是在重复此类代码的函数中使用 lambda。我会在我的问题中解决这个问题。如果“结构身份”在命名空间范围内,您的建议是可以的。加 1
  • @VladimirYanakiev 是的,身份必须在命名空间范围内,原因很明显。无论如何,对于任何认真进行元编程的人来说,这都是非常有价值的工具:D
【解决方案2】:

由于是C++14,可以通过decltype(auto)进行编译器类型推断:

int i = []() -> decltype(auto) {
    return 1;
}();

【讨论】:

  • 我要求扣除 retElem 的类型而不是返回类型。也许我理解错了。你能写更多细节吗?
  • 不是问题的答案。
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多