从具有泛型lambda的字符串中提取具有特定类型的元素

时间:2017-08-04 14:33:04

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

我正在使用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,其中使用了这样的提取。我想将此逻辑仅封装在函数中。

2 个答案:

答案 0 :(得分:2)

泛型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>{});
...

答案 1 :(得分:-3)

由于它是C ++ 14,您可以通过decltype(auto)使用编译器类型推断:

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