Ответ 1
Это потому, что лямбда-функция не является std::function<...>
. Тип
auto lambda = [](const std::string& s) { return std::stoi(s); };
не std::function<int(const std::string&)>
, а что-то неопределенное, которое может быть присвоено std::function
. Теперь, когда вы вызываете свой метод, компилятор жалуется, что типы не совпадают, поскольку преобразование означает создание временного объекта, который не может связываться с неконстантной ссылкой.
Это также не относится к лямбда-функциям, поскольку ошибка возникает, когда вы передаете нормальную функцию. Это тоже не сработает:
int f(std::string const&) {return 0;}
int main()
{
std::vector<int> vec;
C<int> c;
c.func(vec, f);
}
Вы можете назначить лямбда для std::function
std::function<int(const std::string&)> lambda = [](const std::string& s) { return std::stoi(s); };
измените свою функцию-член, чтобы принять функцию по значению или const-ссылке или сделать параметр функции типом шаблона. Это будет немного более эффективным, если вы передадите указатель лямбда или нормальной функции, но мне лично нравится выразительный тип std::function
в сигнатуре.
template<typename T>
class C{
public:
void func(std::vector<T>& vec, std::function<T( const std::string)> f){
//Do Something
}
// or
void func(std::vector<T>& vec, std::function<T( const std::string)> const& f){
//Do Something
}
// or
template<typename F> func(std::vector<T>& vec, F f){
//Do Something
}
};