3

我要實現以下幾點:如何將模板參數包轉換爲函數的多個指針參數?

template <typename Functor, typename... Params> 
void foo(
    size_t n 
    /* magic goes here, producing function parameters p1, p2, etc. */ 
    /* corresponding to the parameter pack.      */ 
) 
{ 
    for(size_t i = 0; i < n; i ++) { 
     std::cout << Functor()( 
      /* pass p1[i], p2[i], etc. corresponding to the */ 
      /* parameter pack.        */ 
     ) << '\n'; 
    } 
} 

因此富將擴展成類似:

void foo(
    size_t n, 
    const int* __restrict__ p1, 
    const int* __restrict__ p2 
) 
{ 
    for(size_t i = 0; i < n; i ++) { 
     std::cout << std::plus()(p1[i], p2[i]) << '\n'; 
    } 
} 

我有一個模糊的直覺,我可能需要超越標準庫複製到類似融合,Brigand或Hana,我剛剛開始研究;但是 - 也許我錯了,比我想象的要簡單。

注:

  • 我在其中傳遞指針給const的是可以接受的一個元組,雖然它的次優的溶液 - 如我不能申請__restrict__它們(因爲它是不是真正的C++,我知道我知道)。其實它本身就很有趣,因爲我可以用元組執行其他技巧。
  • 我不介意仿函數取指針而不是多指針。
  • 我正在使用nvcc + GCC 5.4.1;代碼應該是C++ 11'ish(也就是我可以編譯爲CUDA代碼的C++ 11的一部分)。
  • 我將結果流到std::cout只是爲了不給任何人這個想法我沒有做任何與functor的返回值有關的東西,這似乎是在示例代碼中最直接的做法。
+0

'__restrict__'不是C++。請列出您的確切編譯器,因爲沒有標準的C++程序可以包含'__restrict__',因此您的解決方案必須是編譯器特定的。 – Yakk

+0

@Yakk:夠公平的;看編輯的筆記。 – einpoklum

回答

4
template<class Functor, class...Ts> 
void foo(std::size_t n, 
    Ts const* __restrict__ ... ts 
) { 
    for(size_t i = 0; i < n; i ++) { 
    std::cout << Functor{}(ts[i]...) << '\n'; 
    } 
} 

很好,這很簡單。

Live example

相關問題