gpt4 book ai didi

c++ - 如何划分参数包?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:26 26 4
gpt4 key购买 nike

我想写一个函数模板,apply,它接收一些函数f,一个整数i,和一个参数包. apply 需要解压参数并将f 应用于它们,i 参数pi 除外。对于 pi,它需要先调用一些其他函数 g,然后再将其作为参数传递给 f

看来我需要一种方法将参数包分成左侧、第 i 个参数和右侧。这可能吗?在代码中:

template<int i, typename Function, typename... Parms>
void apply(Function f, Parms... parms)
{
auto lhs = // what goes here?
auto pi = // what goes here?
auto rhs = // what goes here?

f(lhs..., g(pi), rhs...);
}

最佳答案

好的,我们开始吧!它真的丑陋,但我不能匆忙想出一个更好的版本;)大部分内容都是沼泽标准模板特化。最大的问题是创建一个适当大小的整数列表。我似乎记得我想出了一个不错的版本,但不知何故我不记得我做了什么。享受吧!

#include <iostream>
#include <utility>

// printing the values
void print_args() {}
template <typename F> void print_args(F f) { std::cout << f; }
template <typename F, typename... T>
void print_args(F f, T... args)
{
std::cout << f << ", ";
print_args(args...);
}

// the function object to be called:
struct Functor
{
template <typename... T>
void operator()(T... args)
{
std::cout << "f(";
print_args(args...);
std::cout << ")\n";
}
};

// conditionally apply g():
template <typename T> T g(T value) { return 1000 + value; }
template <int i, int j, typename T>
typename std::enable_if<i != j, T>::type forward(T t) { return t; }
template <int i, int j, typename T>
typename std::enable_if<i == j, T>::type forward(T t) { return g(t); }

// create a series of integers:
template <int... Values> struct values {};

template <int Add, typename> struct combine_values;
template <int Add, int... Values>
struct combine_values<Add, values<Values...>>
{
typedef values<Values..., Add> type;
};

template <int Size> struct make_values;
template <> struct make_values<0> { typedef values<> type; };
template <int Size>
struct make_values
{
typedef typename combine_values<Size, typename make_values<Size -1>::type>::type type;
};

// applying f(t...) except for ti where g(ti) is called
template <int i, int... Values, typename Function, typename... T>
void apply_aux(values<Values...>, Function f, T... t)
{
f(forward<i, Values>(t)...);
}

template <int i, typename Function, typename... T>
void apply(Function f, T... t)
{
apply_aux<i>(typename make_values<sizeof...(T)>::type(), f, t...);
}

int main()
{
apply<3>(Functor(), 1, 2, 3, 4, 5, 6, 7, 8);
apply<4>(Functor(), 1, 2, 3, 4, 5, 6, 7, 8);
apply<5>(Functor(), 1, 2, 3, 4, 5, 6, 7, 8);
}

关于c++ - 如何划分参数包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8812856/

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