将函数的返回值存储在元组中
Storing return values of functions in a tuple
考虑
#include <tuple>
template <typename... F>
auto execute (F... f) {
return std::make_tuple(f(0)...);
}
int foo(int) { return 5; }
int bar(int) { return 3; }
int main() {
auto tuple = execute(foo, bar);
}
有什么好的变通方法可以让酒吧返回void?
我试过这个,但它不会编译:
#include <tuple>
struct Void { };
template <typename T>
T check(T n) { return n; }
Void check(void) { return Void{}; }
template <typename... F>
auto execute (F... f) {
return std::make_tuple(check(f(0))...);
}
int foo(int) { return 5; }
void bar(int) { }
int main() {
auto tuple = execute(foo, bar);
}
更新:我有一个暂定的解决方案,但只有当我们知道传递的参数总是int 0时,它才有效。我会尽量让它在任何一般情况下都能工作。或者像Steve建议的那样使用std::可选。
#include <tuple>
#include <type_traits>
struct Void { };
template <typename F>
auto execute_h (F f, std::enable_if_t<!std::is_void_v<std::result_of_t<F(int)>>>* = nullptr) {
const auto result = f(0);
return result;
}
template <typename F>
auto execute_h (F f, std::enable_if_t<std::is_void_v<std::result_of_t<F(int)>>>* = nullptr) {
f(0);
return Void{};
}
template <typename... F>
auto execute (F... f) {
return std::make_tuple(execute_h(f)...);
}
int foo(int) { return 5; }
void bar(int) { }
int main() {
auto tuple = execute(foo, bar);
}
滥用operator ,
的过载(因为void(), T
不会调用自定义operator,
):
#include <tuple>
struct Void {};
template <typename T>
T&& operator , (T&& t, Void) { return std::forward<T>(t); }
template <typename... Fs>
auto execute (Fs... fs) {
return std::make_tuple((f(0), Void{})...);
}
int foo(int) { return 5; }
void bar(int) { }
int main() {
auto tuple = execute(foo, bar); // tuple<int, Void>
}
您可以使用std::enable_if
和包装函数为返回void
:的函数返回Void
对象
#include <tuple>
#include <type_traits>
struct Void { };
template <typename Func, typename... Args>
auto check(Func func, Args&&... args)
-> std::enable_if_t<!std::is_void<decltype(func(std::forward<Args>(args)...))>::value, decltype(func(std::forward<Args>(args)...))>
{
return func(std::forward<Args>(args)...);
}
template <typename Func, typename... Args>
auto check(Func func, Args&&... args)
-> std::enable_if_t<std::is_void<decltype(func(std::forward<Args>(args)...))>::value, Void>
{
func(std::forward<Args>(args)...); return Void{};
}
template <typename... F>
auto execute (F... f) {
return std::make_tuple(check(f, 0)...);
}
int foo(int) { return 5; }
void bar(int) { }
int main() {
auto tuple = execute(foo, bar);
}
现场演示
它有点重复,但它可以完成任何类型的函子、任何参数列表和任何返回类型的工作。
值得注意的是,有一个建议是将void
作为常规类型,这样可以避免所有这些麻烦,但我不确定这是什么状态,也不确定它是否会被接受。
相关文章:
- C++:TypeDef使用元组
- Pybind11:将元组列表从Python传递到C++
- 重载元组索引运算符-C++
- 在C++中,如何通过几种类型从元组中选择多个元素
- 如何在 c++ 中存储具有值的四个参数的元组
- C++将原始字符数组存储在元组中
- 将函数的返回值存储在元组中
- c++存储映射元组的引用,以便在另一个函数中使用
- 由std ::元组存储的垃圾价值
- 找不到将数组中的元素数存储在函数内的 int 变量中的方法
- 使用平面数组存储的元组容器
- C++11绑定std::函数与存储元组和解包
- 创建一个伪元组,一个存储在其他地方的数据的前端
- c++在存储指针元组时遇到问题
- 用于存储唯一<键,值>元组的数据结构,其中<value>最小值
- 传递许多函数并将其所有结果存储在元组中
- 使用自动 c++ 检索存储元组的值
- 用于存储元组键的数据结构:参数关系列表
- 元组的数据存储在哪里
- 非交错存储元组的C++容器