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

Extracting element with specific type from string with 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。我只想把这个逻辑封装在函数中。

通用 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>{});
...

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

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