Я использую с ++. У меня есть строка, которая может содержать элемент с начала ^
и заканчивается $
, Этот элемент может быть 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. Есть ли способ использовать лямбду в этом случае. Я хочу использовать обобщенную лямбду в функции, где используется такое извлечение. Я хочу инкапсулировать эту логику только в функцию.
Общие лямбды должны иметь аргумент (шаблонного) типа, вы не можете иметь общую лямбду, шаблонизированную без аргумента. Самый простой способ решить вашу проблему — предоставить фиктивный аргумент заданного типа. Как в:
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;
}();