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

c++ variadic template argument iterating

本文关键字:参数 迭代 C++ 变参      更新时间:2023-10-16

我在这些事情上非常缺乏经验,但我正在尝试创建一个模板函数,该函数在"旋转"参数处评估 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;
}

但是如何使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 的实现。

演示。