Извлечение элемента с определенным типом из строки с общей лямбда

Я использую с ++. У меня есть строка, которая может содержать элемент с начала ^ и заканчивается $, Этот элемент может быть int или же string,

Пример:

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

Я хотел бы написать лямбда-функцию, которая будет делать это.
Если я использую функцию шаблона, код будет выглядеть так:

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

но когда я пытаюсь использовать универсальную лямбду, я достигаю этой ситуации:

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

проблема в том, как получить тип retElem. Есть ли способ использовать лямбду в этом случае. Я хочу использовать обобщенную лямбду в функции, где используется такое извлечение. Я хочу инкапсулировать эту логику только в функцию.

0

Решение

Общие лямбды должны иметь аргумент (шаблонного) типа, вы не можете иметь общую лямбду, шаблонизированную без аргумента. Самый простой способ решить вашу проблему — предоставить фиктивный аргумент заданного типа. Как в:

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

Другие решения

Поскольку это C ++ 14, вы можете использовать вывод типа компилятора через decltype(auto):

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

По вопросам рекламы [email protected]