Пытался написать функцию, которая делает то, что указано в заголовке:
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)),
};
Проверка
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
ЗдравствуйтеИмеется вот такая иерархия:
Всем приветХочу добиться корректного расположения QToolBox в QTabWidget
Не работает javascript в нативном браузере AndroidПритом проблема не в браузере, потому что на других сайтах js работает