gpt4 book ai didi

C++11:我可以从多个 args 转到 tuple,但我可以从 tuple 转到多个 args 吗?

转载 作者:IT老高 更新时间:2023-10-28 12:38:50 25 4
gpt4 key购买 nike

Possible Duplicate:
How do I expand a tuple into variadic template function's arguments?
“unpacking” a tuple to call a matching function pointer

在 C++11 模板中,有没有办法使用元组作为(可能是模板)函数的单独参数?

示例:
假设我有这个功能:

void foo(int a, int b)  
{
}

我有元组 auto bar = std::make_tuple(1, 2) .

我可以用它来调用foo(1, 2)吗?以模板方式?

我的意思不是简单的 foo(std::get<0>(bar), std::get<1>(bar))因为我想在不知道 args 数量的模板中执行此操作。

更完整的例子:

template<typename Func, typename... Args>  
void caller(Func func, Args... args)
{
auto argtuple = std::make_tuple(args...);
do_stuff_with_tuple(argtuple);
func(insert_magic_here(argtuple)); // <-- this is the hard part
}

我应该注意,我不想创建一个模板适用于一个 arg,另一个模板适用于两个,等等......

最佳答案

试试这样的:

// implementation details, users never invoke these directly
namespace detail
{
template <typename F, typename Tuple, bool Done, int Total, int... N>
struct call_impl
{
static void call(F f, Tuple && t)
{
call_impl<F, Tuple, Total == 1 + sizeof...(N), Total, N..., sizeof...(N)>::call(f, std::forward<Tuple>(t));
}
};

template <typename F, typename Tuple, int Total, int... N>
struct call_impl<F, Tuple, true, Total, N...>
{
static void call(F f, Tuple && t)
{
f(std::get<N>(std::forward<Tuple>(t))...);
}
};
}

// user invokes this
template <typename F, typename Tuple>
void call(F f, Tuple && t)
{
typedef typename std::decay<Tuple>::type ttype;
detail::call_impl<F, Tuple, 0 == std::tuple_size<ttype>::value, std::tuple_size<ttype>::value>::call(f, std::forward<Tuple>(t));
}

例子:

#include <cstdio>
int main()
{
auto t = std::make_tuple("%d, %d, %d\n", 1,2,3);
call(std::printf, t);
}

通过一些额外的魔法并使用 std::result_of,您可能还可以使整个事物返回正确的返回值。

关于C++11:我可以从多个 args 转到 tuple,但我可以从 tuple 转到多个 args 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10766112/

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