devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻

Почему нельзя передавать лямбду как аргумент шаблона?

#include <iostream>

template <void (*function)()>
struct A {
	static void call() {
		function();
	}
};

void test() {
	std::cout << "function" << std::endl;
}

int main() {
	A<test>::call();
	/* does not work
	A<[](){
		std::cout << "lambda" << std::endl;
	}>::call();
	*/
	
	return 0;
}


Что мешает передать лямбду при условии, что она не захватывает никаких переменных?
  • Вопрос задан
  • 361 просмотр
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
#include <iostream>

template <class Body>
void call(const Body& body) {
    body();
};

void test() {
  std::cout << "function" << std::endl;
}

int main() {
  call(test);
  call([]() {
    std::cout << "lambda" << std::endl;
  });
  return 0;
}


Дело в том, что лямбда — это объект неизвестного класса с операцией (). И только так её вызывают.
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Ну, например то, что у неё тип не совпадает с тем, что указано в шаблоне. У неё тип что-то вроде класса с оператором (). Но даже если вы так напишите, то всё равно работать не будет. Ведь нужен ещё и объект для вызова метода.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы