簡體   English   中英

C ++可變參數模板參數迭代

[英]c++ variadic template argument iterating

我在這類事情上沒有經驗,但是我試圖創建一個模板函數,該函數在“ rotated”自變量中評估一個n變量函數(請參見下面的示例),並返回所有這些值的向量。

例如,對於具有函數f (x,y,z)的n = 3,返回的Triple \\ 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的運行時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的實現。

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM