3

Je veux mettre en œuvre les éléments suivants:Comment puis-je convertir un pack de paramètres de modèle en plusieurs arguments de pointeur en une fonction?

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'; 
    } 
} 

ainsi foo élargirait en quelque chose comme:

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'; 
    } 
} 

J'ai une vague intuition que je pourrais avoir besoin d'aller au-delà de la bibliothèque standard dans quelque chose comme Fusion , Brigand ou Hana, que je viens de commencer à examiner; mais - peut-être que je me trompe et c'est plus simple que je ne le pense.

Note:

  • Une solution dans laquelle je passe un tuple de pointeurs à const est acceptable, bien qu'il soit sous-optimale - que je ne peux pas appliquer __restrict__ à eux (comme il est pas vraiment C++, je sais que je sais). En fait, c'est même intéressant en soi puisque je pourrais être capable d'effectuer d'autres tours avec le tuple. Cela ne me dérange pas que le foncteur prenne un seul nombre de pointeurs au lieu de plusieurs pointeurs individuels. J'utilise nvcc + GCC 5.4.1; le code devrait être C++ 11'ish (c'est-à-dire la partie de C++ 11 que je peux compiler comme code CUDA).
  • Je stream le résultat à std::cout juste pour ne donner à personne l'idée que je ne fais rien avec la valeur de retour du foncteur, et cela semblait être la chose la plus simple à faire dans l'exemple de code.
+0

'__restrict__' n'est pas C++. Veuillez lister votre compilateur exact, car aucun programme C++ standard ne peut contenir '__restrict__', votre solution doit donc être spécifique au compilateur. – Yakk

+0

@Yakk: assez bien; voir les notes éditées. – einpoklum

Répondre

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'; 
    } 
} 
bien

, qui était facile.

Live example.