gpt4 book ai didi

c++ - 如何对通用列表提取进行元编程以构建函数调用

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

我有一系列类,其方法具有以下签名:

double compute(list<T> pars)

此方法使用通过 pars 接收的参数执行计算.对于每个 compute(list)方法,我还有一个compute(x1, x2, ..., xn)这是实现实际计算的方法。因此,compute(pars)应该做一些,例如:

double compute(list<T> pars)
{
T x1 = list.pop_back();
T x2 = list.pop_back();
// .. so on until last parameter xn
T xn = list.pop_back();

return compute(x1, x2, .., xn); // here the real implementation is called
}

这个模式重复了很多次,唯一可以改变的是pars的大小。列出并当然执行 compute(x1, x1, ..) .

我想找到一种方法来“干燥”这个重复的过程;具体来说,提取pars中的参数列出并构建对 compute(x1, x2, .., xn) 的调用.我一直在尝试做一些宏观技巧但没有成功。

我的问题是它是否存在某种基于元编程的方式允许我实现 compute(list<T> pars)一次并简单地重用它 n 以执行对 compute(x1, x2, ..., xn) 的调用

编辑:这是另一个compute(x1, ...)的签名

VtlQuantity compute(const VtlQuantity & x1, 
const VtlQuantity & x2,
// any number of pars according the class
const VtlQuantity & xn) const

'Vtl数量is a class representing double ,它们的单位和其他东西。

最佳答案

您可以执行以下操作:

template <typename Func, typename T, std::size_t ... Is>
decltype(auto) apply(Func&& f, const std::list<T>& pars, std::index_sequence<Is...>)
{
std::vector<T> v(pars.rbegin(), pars.rend());

return std::forward<Func>(f)(v.at(Is)...);
}

template <std::size_t N, typename Func, typename T>
decltype(auto) apply(Func&& f, const std::list<T>& pars)
{
return apply(std::forward<Func>(f), pars, std::make_index_sequence<N>());
}

用法类似于:

apply<6>(print, l);

Demo

要自动计算函数的元数,您可以创建一个特征:

template <typename F> struct arity;

template <typename Ret, typename ...Args> struct arity<Ret(Args...)>
{
static constexpr std::size_t value = sizeof...(Args);
};

然后

template <typename Func, typename T>
decltype(auto) apply(Func&& f, const std::list<T>& pars)
{
constexpr std::size_t N = arity<std::remove_pointer_t<std::decay_t<Func>>>::value;
return apply(std::forward<Func>(f), pars, std::make_index_sequence<N>());
}

Demo

您必须丰富 arity 以支持 Functor(作为 lambda)。

关于c++ - 如何对通用列表提取进行元编程以构建函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39166510/

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