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的返回值有關的東西,這似乎是在示例代碼中最直接的做法。
'__restrict__'不是C++。請列出您的確切編譯器,因爲沒有標準的C++程序可以包含'__restrict__',因此您的解決方案必須是編譯器特定的。 – Yakk
@Yakk:夠公平的;看編輯的筆記。 – einpoklum