我正在为未来的库编写一些泛型代码。我在一个模板函数中遇到了以下问题。考虑下面的代码:
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和非void
-returning函数,这能以一种优雅的方式以通用的方式轻松完成吗?
编辑:在函数f()
和我想要做的泛型内容之间有数据依赖关系,所以我没有考虑这样的代码:
template<class F>
auto foo(F &&f) {
//do some generic stuff
return std::forward<F>(f)(/*some args*/);
}
https://stackoverflow.com/questions/56256640
复制相似问题