gpt4 book ai didi

c++ - 如何调用函数,传递仿函数的返回值(可能为空)?

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:25 24 4
gpt4 key购买 nike

给定一个函数,该函数调用模板化函数参数并调用另一个函数对返回值执行某些操作:

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

Working example on Ideone

最佳答案

我认为您可以创建一个结构助手来使用重载的 , 运算符,或多或少像这样:

#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);
}

[live demo]

编辑:

感谢 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);
}

[live demo]

关于c++ - 如何调用函数,传递仿函数的返回值(可能为空)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41464849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com