gpt4 book ai didi

C++ 可变参数模板参数迭代

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

我在这方面经验不足,但我正在尝试创建一个模板函数,该函数在“旋转”参数(参见下面的示例)处评估 n 变量函数并返回一个 vector 所有这些值。

例如对于 n=3 函数 f(x,y,z) 返回的三元组 vector 应该是

< f(x,0,0), f(0,x,0), f(0,0,x) >

我需要的原始版本可能如下所示(不一定正确\工作)

typedef FunctionSignature Function;

template<class Function, size_t Dimensions>
std::array<Function::Out,Dimensions> F(Function::InComponent x)
{
std::array<Function::Out,Dimensions> Result;

for (i=0; i<Dimensions; i++)
Result[i] = Function::f("rotate((x,0,...,0),i)");

return Result;
}

但是如何制作 rotate 东西。

我也希望可以以某种方式消除运行时 for,因为 n 在编译时是众所周知的。

最佳答案

template<class Function, size_t... Is, size_t... Js>
typename Function::Out call_f(typename Function::InComponent x,
std::index_sequence<Is...>,
std::index_sequence<Js...>) {
return Function::f((void(Is), 0)..., x, (void(Js), 0)...);
}

template<class Function, size_t Dimensions, size_t... Is>
std::array<typename Function::Out, Dimensions> F(typename Function::InComponent x,
std::index_sequence<Is...>)
{
return {{ call_f<Function>(x, std::make_index_sequence<Is>(),
std::make_index_sequence<Dimensions - Is - 1>())... }};
}

template<class Function, size_t Dimensions>
std::array<typename Function::Out,Dimensions> F(typename Function::InComponent x)
{
return F<Function, Dimensions>(x, std::make_index_sequence<Dimensions>());
}

对于 C++11,在 SO 上搜索 make_index_sequence 的实现。

Demo .

关于C++ 可变参数模板参数迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38258224/

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