gpt4 book ai didi

c++ - 如何更改参数包中的最后一个参数?

转载 作者:可可西里 更新时间:2023-11-01 18:30:51 25 4
gpt4 key购买 nike

我有一个函数f1()

template <typename... Args>
void f1(Args... args)
{
// the implementation is just an example, I don't really need a complicated
// way to sum numbers
boost::fusion::vector<Args...> v(args...);
std::cout << boost::fusion::accumulate(v, 0, [](auto i1, auto i2) { return i1 + i2; }) << std::endl;
}

我想从函数 f2() 中调用它,但最后一个参数不同。有没有简单的方法?我尝试了一个幼稚的

template <typename... Args>
struct CallHelper;

template <>
struct CallHelper<>
{
template <typename... Args>
static void Apply(Args... args) { f1(args...); }
};

template <typename A0>
struct CallHelper<A0>
{
template <typename... Args>
static void Apply(Args ...args, A0 a0)
{
// substitute 10 to the last argument
CallHelper<>::Apply(args..., 10);
}
};

template <typename Head, typename ...TailArgs>
struct CallHelper<Head, TailArgs...>
{
template <typename... Args>
static void Apply(Args... args, Head head, TailArgs ...tailArgs)
{
CallHelper<TailArgs...>::Apply(args..., head, tailArgs...);
}
};

template <typename... Args>
void f2(Args... args)
{
CallHelper<Args...>::Apply(args...);
}

当然不行,因为Head head不是第一个参数。也许有办法让 Head head 也成为参数包?或者还有什么我可以做的?

最佳答案

您可以将您的参数作为元组转发,然后使用 std::integer_sequence 解压除最后一个以外的所有参数。这段代码看起来比您的方法简单得多:

template<typename... Args>
void f1(Args... args)
{
boost::fusion::vector<Args...> v(args...);
std::cout << boost::fusion::accumulate(v, 0, [](auto i1, auto i2) { return i1 + i2; }) << std::endl;
}

template<typename Tuple, size_t... idx>
void callImpl(Tuple&& tuple, std::index_sequence<idx...>)
{
f1(std::get<idx>(std::forward<Tuple>(tuple))..., 10);
}

template<typename... Ts>
void callWithLast10(Ts&&... ts)
{
callImpl(std::forward_as_tuple(ts...), std::make_index_sequence<sizeof...(Ts) - 1>());
}

用法:

f1(1, 2, 3, 4); // Prints 10
callWithLast10(1, 2, 3, 4); // Prints 16

关于c++ - 如何更改参数包中的最后一个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44659013/

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