Mic*_*sky 5 c++ templates generic-programming c++11
我对这些事情缺乏经验,但我正在尝试创建一个模板函数,在"旋转"参数下评估n变量函数(参见下面的示例)并返回所有这些值的向量.
例如,对于具有函数f(x,y,z)的n = 3,返回的三元\向量应该是
< 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;
}
Run Code Online (Sandbox Code Playgroud)
但是如何做到这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>());
}
Run Code Online (Sandbox Code Playgroud)
对于C++ 11,在SO上搜索实现make_index_sequence.
演示.