作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
给定一个函数,该函数调用模板化函数参数并调用另一个函数对返回值执行某些操作:
template <typename T>
void doSomething(T &&) {
// ...
}
template <typename T_Func>
void call(T_Func &&func) {
doSomething(func());
}
如何扩展它以使用返回 void
的仿函数?理想情况下,我想添加一个重载的 void doSomething() { ... }
如果 func
的返回类型是 void
.
目前,如果 func
返回 void
,这只会导致 error: invalid use of void expression
。
最佳答案
我认为您可以创建一个结构助手来使用重载的 ,
运算符,或多或少像这样:
#include <type_traits>
#include <utility>
struct my_void { };
struct my_type { };
template <class T, typename std::enable_if<std::is_void<T>::value>::type* = nullptr>
my_void operator,(T, my_type) { return {}; }
template <class T, typename std::enable_if<!std::is_void<T>::value>::type* = nullptr>
T &&operator,(T &&val, my_type) { return std::forward<T>(val); }
template <typename T>
void doSomething(T &&) {
}
template <typename T_Func>
void call(T_Func &&func) {
doSomething((func(), my_type{}));
}
int main() {
auto func1 = []() -> bool { return true; };
auto func2 = []() -> void { };
call(func1);
call(func2);
}
编辑:
感谢 Piotr Skotnicki 和 Holt(他们指出第一个重载实际上永远不会被触发并提出了该方法的简化版本):
#include <type_traits>
#include <utility>
struct dumb_t { };
template <class T>
T &&operator,(T &&val, dumb_t) { return std::forward<T>(val); }
template <typename T>
void doSomething(T &&) {
}
template <typename T_Func>
void call(T_Func &&func) {
doSomething((func(), dumb_t{}));
}
int main() {
auto func1 = []() -> bool { return true; };
auto func2 = []() -> void { };
call(func1);
call(func2);
}
关于c++ - 如何调用函数,传递仿函数的返回值(可能为空)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41464849/
我是一名优秀的程序员,十分优秀!