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

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

2 ответа

Решение

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

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;
}();
Другие вопросы по тегам