call( R (*f)(T...), R1 callback, T... arg ) {
static_assert(std::is_convertible<R1, std::function<void (R)>>::value, "callback is not valid");
std::function<void ()> func;
func = std::bind(callback, std::bind(f, arg...));
func();
}
int a(int a) { return a; }
std::string b(std::string b) { return b; }
int main() {
call(a, [] (int r) { std::cout << r << std::endl; }, 1);
call(b, [] (std::string r) { std::cout << r << std::endl; }, std::string("str"));
return 0;
}
Сделал через static_assert или это не корректно?
К чему тут std::function? Смотри в сторону invoke, invoke_result
Да, только не понятен смысл функтион и двойного бинда, выше подсказали использовать инвок.
template <class F, class U, class... Args> void call(F&& f, U&& callback, Args&& ...args) { std::forward<U>(callback)(std::forward<F>(f)(std::forward<Args>(args)...)); } и поехали
Обсуждают сегодня