Обнаружена ошибка при использовании анонимной функции в шаблоне. - PullRequest
0 голосов
/ 19 января 2020

Я сталкиваюсь с ошибкой анонимной функции при использовании шаблона. Я хочу создать функцию и передать ей параметр. Это должно быть просто, но я получаю ошибку. Если я не использую шаблон и просто заменяю реальный тип, тогда код работает. Что я делаю не так?

нет соответствующей функции для вызова 'print'

template <typename mytype>
void print(mytype arg1, std::function<void(mytype)> arg2)
{
   arg2(arg1);
}
.
.
auto myLamba = [](int x){std::cout << "x = " << x << std::endl;};
print (9999, myLamba);

1 Ответ

1 голос
/ 19 января 2020

Лямбда это не std::function. Его можно преобразовать в std::function, но в вашем шаблоне вы сопоставляете mytype с обоими параметрами.

Это означает, что параметры должны иметь возможность выполнять точное совпадение без какого-либо преобразования обоих аргументов. для правильного соответствия шаблона.

Вы могли бы явно указать тип, чтобы он работал

print<int>(9999, myLamba);

Однако лучше не использовать std::function, просто Может быть отдельным параметром шаблона. Таким образом может быть передан любой вызываемый тип, и в качестве бонуса вы избежите накладных расходов на его стирание в std::function.

template <typename mytype, typename Func>
void print(mytype arg1, Func arg2)
{
   arg2(arg1);
}

auto myLamba = [](int x){std::cout << "x = " << x << std::endl;};
print (9999, myLamba); // Now this works
...