Передать лямбду в шаблонную функцию с выведенными типамиC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Передать лямбду в шаблонную функцию с выведенными типами

Сообщение Anonymous »

У меня есть следующий пример с двумя версиями функции make, которая принимает другую функцию и определяет типы аргументов. Затем с помощью этой функции создается структура шаблонного типа Signature.

Код: Выделить всё

enum class SomeEnum {
ONE = 1,
TWO = 2,
};

template 
struct Signature {
static constexpr SomeEnum Type = _Type;
using Result = _Result;
using Args = std::tuple;

std::function func;
};

template <
SomeEnum _Type,
typename _Result,
typename... _Args>
Signature make(
std::function func) {
return Signature{.func = func};
}

template 
Signature make(
_Result (*func)(_Args...)) {
return Signature{
.func = std::move(func)};
}

void foo(int x, std::string y, int z) {
}

auto sig1 = make(&foo);

auto sig2 = make([](int x, std::string y, int z) {
});
Эта версия работает:

Код: Выделить всё

auto sig1 = make(&foo);
но эта версия:

Код: Выделить всё

auto sig2 = make([](int x, std::string y, int z) {
});
Нет

Код: Выделить всё

main.cpp:40:13: error: no matching function for call to 'make'
auto sig2 = make([](int x, std::string y, int z) {
^~~~~~~~~~~~~~~~~~~
main.cpp:23:37: note: candidate template ignored: could not match 'std::function' against '(lambda at main.cpp:40:33)'
Signature make(
^
main.cpp:29:37: note: candidate template ignored: could not match '_Result (*)(_Args...)' against '(lambda at main.cpp:40:33)'
Signature make(
^
1 error generated.
Однако, если я явно задаю тип, это работает:

Код: Выделить всё

std::function l = [](int x, std::string y, int z) {
};

auto sig2 = make(l);
Как мне сделать эту версию:

Код: Выделить всё

auto sig2 = make([](int x, std::string y, int z) {
});
работаете? Я хотел бы иметь возможность просто передавать лямбда-выражения с дополнительным набором текста, а код выводит типы.

Подробнее здесь: https://stackoverflow.com/questions/790 ... uced-types
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»