2017-09-23 6 views
0

J'ai eu une fonction (lambda) et beaucoup de foncteurs passés en pack d'arguments variadiques dans une troisième fonction. La signature ressembleAppel d'une fonction avec un paramètre d'un pack de foncteurs en template variadique

template<typename F, typename... G> 
ret_t call(F&& func, G&&... getters); 

et F a autant comme argument que le nombre de getters donné.

Maintenant, je dois appeler func avec la valeur de retour de getter appelée par rapport à une constante codée en dur (constexpr) déterminée autrement. Donc, le code sans matrice pourrait ressembler

{ 
    return func(getters_1(0), getters_2(0), getters_3(0) /* , ... */); 
} 

Bien sûr, je veux automatiser le processus avec le modèle métaprogrammation.


Je veux éviter un tableau temporaire ou un conteneur intermédiaire quelconque. (Cela ne vise pas ce générique, je connais le type de retour des getters.) Je veux qu'il soit transmis à la fonction aussi directement que possible afin de permettre l'optimisation et d'éviter le gaspillage de mémoire.

Je pourrais avoir enveloppé F avec de nombreux niveaux de fermeture de lambda, chacun y ajoute un paramètre, et espère le meilleur du compilateur, mais de toute façon je demande des façons meilleures et plus claires de le faire.

+0

C++ 11, C++ 14 ou 17 C++? – max66

+0

@ max66, j'utilise g ++ 7.2 donc C++ 17. – YiFei

+0

@YiFei La constante est-elle toujours la même? – Rakete1111

Répondre

4

Si je vous comprends bien, vous voulez quelque chose comme ceci:

template<typename F, typename... G> 
ret_t call(F&& func, G&&... getters) { 
    return std::forward<F>(func)(std::forward<G>(getters)(0)...); 
} 
+1

C'est vraiment rafraîchissant! Je vais essayer cela plus tard, je n'ai jamais su que je pouvais transférer et appeler des fonctions en une seule étape. – YiFei