Я писал такие функции более высокого порядка:
template<typename F, typename... Args>
void doStuff(F f, Args&&... args)
{
// ...
f(std::forward<Args>(args)...);
// ...
}
Или замените F f
на F&& f
.
Но после того, как я узнал о ref-qualifiers (ouch), все усложнилось. Представьте себе класс функтора:
struct Foo {
void operator()(...) &;
void operator()(...) &&;
};
Тогда мои предыдущие реализации doStuff
будут когда-либо вызывать метод &
, так как параметры всегда lvalues.
Я думаю, что способ решить это - реализовать doStuff
следующим образом:
template<typename F, typename... Args>
void doStuff(F&& f, Args&&... args)
{
// ...
std::forward<F>(f)(std::forward<Args>(args)...);
// ...
}
Это также означает, что std::result_of
возможно реализовано. Я хочу знать, есть ли какой-то недостаток этой реализации, т.е. Следует ли мне заменять все мои HOF-реализации?