Пытался написать функцию, которая делает то, что указано в заголовке:
template<class T>
function<string(int)> conv(function<T(int)> f) {
return [&](int x) -> string {
stringstream ss;
ss << f(x);
return ss.str();
};
}
ideone
clang выдает такую ошибку:
prog.cpp:28:3: error: no matching function for call to 'conv'
conv(f1),
^~~~
prog.cpp:17:23: note: candidate template ignored: could not match 'function<type-parameter-0-0 (int)>' against 'int (*)(int)'
function<string(int)> conv(function<T(int)> f) {
Или такое только макросами делается?
Полный код:
#include <iostream>
#include <functional>
#include <sstream>
#include <vector>
using namespace std;
int f1(int x) {
}
string f2(int x) {
}
long long f3(int x) {
}
template<class T>
function<string(int)> conv(function<T(int)> f) {
return [&](int x) -> string {
stringstream ss;
ss << f(x);
return ss.str();
};
}
int main() {
vector<function<string(int)>> funcs = {
conv(f1),
};
return 0;
}
Проблема в том, что у вас аргумент conv не преобразуется автоматически в std::function, вам надо или поменять саму функцию:
template<class T>
function<string(int)> conv(T(*f)(int)) { //меняем сигнатуру
return [f](int x) -> string { // завхватываем f по значению
stringstream ss;
ss << f(x);
return ss.str();
};
}
или заворачивать аргумент функции в std::function:
vector<function<string(int)>> funcs = {
conv(std::function<int(int)>(f1)),
};
Проверка
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники