C++ 可变模板参数迭代

5
我在这方面经验不足,但我正在尝试创建一个模板函数,该函数在“旋转”参数处评估一个n变量函数(参见下面的示例),并返回所有这些值的向量。
例如,对于n=3且具有函数f(x,y,z),返回的三元组向量应为: < 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


不要让你的 f() 函数以显式值列表的形式作为参数,而是让你的 f() 函数以值向量的形式作为参数。用值填充向量以作为参数传递变得非常简单。无需处理可变参数函数。 - Sam Varshavchik
  1. 我想把“f”向量化应该没有问题...尽管当“n”=1时可能会冗余。
  2. “变得微不足道”并没有帮助... 特别是,我不确定它如何帮助在编译时完成。
- Michael Medvinsky
1个回答

5
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,可以在stackoverflow上搜索make_index_sequence的实现。

演示


谢谢,这看起来非常不错,正是我所需要的!(带着一个很大的希望,我知道自己需要什么,哈哈) - Michael Medvinsky
我猜在完全通用的情况下,(void(Is), 0)... 应该改为 (void(Is), Function::InComponent(0) )... - Michael Medvinsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接