Я нахожусь в процессе написания общего кода для будущей библиотеки. Я столкнулся со следующей проблемой внутри функции шаблона. Рассмотрим код ниже:
template<class F>
auto foo(F &&f) {
auto result = std::forward<F>(f)(/*some args*/);
//do some generic stuff
return result;
}
Он будет работать нормально, если я не передам ему функцию, которая возвращает void
вроде:
foo([](){});
Теперь, конечно, я мог бы использовать магию std::enable_if
чтобы проверить тип возвращаемого значения и выполнить специализацию для функции, возвращающей void
которая выглядит следующим образом:
template<class F, class = /*enable if stuff*/>
void foo(F &&f) {
std::forward<F>(f)(/*some args*/);
//do some generic stuff
}
Но это ужасно дублирует код для фактически логически эквивалентных функций. Может ли это быть легко сделано общим способом для элегантных способов как void
-returning, так и non- void
-returning?
РЕДАКТИРОВАТЬ: есть зависимость данных между функцией f()
и общими вещами, которые я хочу сделать, поэтому я не принимаю код, подобный этому:
template<class F>
auto foo(F &&f) {
//do some generic stuff
return std::forward<F>(f)(/*some args*/);
}