gpt4 book ai didi

c++ - 使用参数包扩展调用具有可变参数的函数,但修改第 i 个参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:13 27 4
gpt4 key购买 nike

假设我们有一个函数

template<typename T, typename... Args>
T f(Args... args);

我们想在另一个函数中调用f

template<typename... Args>
void bar(Args... args) {
// f(args1, ..., args(i-1), "modified argsi", args(i+1), ..., argsn);
}

并为所有 i = 1, ..., n 修改第 i 个参数(并保持其他参数不变)。 f 将返回一个结果,我想将所有 n 结果存储在 valarray 中。

我们怎样才能做到这一点?

最佳答案

使用 I 编译时值,您可以:

namespace detail
{

template<std::size_t I>
struct impl
{
template <typename TUPLE>
auto operator() (TUPLE&& t) { return std::get<I>(t); }
};

template<>
struct impl<2>
{
template <typename TUPLE>
auto operator() (TUPLE&& t) { return std::get<2>(t) + 40; }
};

template <std::size_t... Is, typename TUPLE>
void bar(std::index_sequence<Is...>, TUPLE&& Tuple) {
return f(impl<Is>{}(std::forward<TUPLE>(Tuple))...);
}

}

template<typename... Args>
void bar(Args... args) {
detail::bar(std::index_sequence_for<Args...>(), std::forward_as_tuple(args...));
}

Live Demo

使用 i 一个运行时值:

namespace detail
{

template<class T>
auto modifier(T&& arg, std::size_t i, std::size_t pos) {
if (i == pos)
return arg + 40; // Or appropriate modification.
else
return std::forward<T>(arg);
}

template <std::size_t... Is, typename... Args>
void bar(std::size_t pos, std::index_sequence<Is...>, Args&&... args) {
return f(modifier(std::forward<Args>(args), Is, pos)...);
}

}

template<typename... Args>
void bar(std::size_t pos, Args&&... args) {
detail::bar(pos, std::index_sequence_for<Args...>(), std::forward<Args>(args)...);
}

Live Demo

关于c++ - 使用参数包扩展调用具有可变参数的函数,但修改第 i 个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30309012/

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