template<typename T>
void f(void (*func)(const T&)) {
(*func)(T());
}
void func(const int& i) {
std::cout << i << std::endl;
}
int main() {
f(&func);
}
Здесь аргумент шаблона T (= int)
из f
автоматически вычтена на основе первого аргумента функции func
.C++ тип аргумента для аргументов шаблона дедукции
Может ли это быть расширено для работы с общими функторами (функциями лямбды или другими функциональными объектами.) Возможно, со второй функцией, то есть что-то вроде
template<typename T, typename Function> void f(Function func);
template<typename Function>
void call_f(Function func) {
using arg_type = first_argument_type_t<Function>; // ???
f<arg_type, Function>(func);
}
Падения на func
в f
должно быть в состоянии быть встроенный компилятором, поэтому std::function
не может быть использован.
Для вывода типа аргумента существует множество случаев. –
Вы не будете делать это в общем случае, т. Е. Если этот функтор является общей лямбда или экземпляром класса с перегруженным/templated 'operator()' –