En C 20, la capture des détails du contexte d'appel de fonction est rendue possible avec std::source_location. Cependant, son utilisation avec des fonctions de modèle variadiques s'est avérée difficile en raison du positionnement du paramètre source_location.
Le problème de position
Invariablement, les paramètres variadiques habitent la fin du liste de paramètres. Cela a entravé l'utilisation de std::source_location pour les raisons suivantes :
Première tentative :
<code class="cpp">template <typename... Args> void debug(Args&&... args, const std::source_location& loc = std::source_location::current());</code>
échoue car les paramètres variadiques doivent résider à la fin.
Deuxième Tentative :
<code class="cpp">template <typename... Args> void debug(const std::source_location& loc = std::source_location::current(), Args&&... args);</code>
introduit une ambiguïté pour les appelants car elle introduit un paramètre inattendu.
Solution : adopter des guides de déduction
La forme initiale peut être revitalisée en introduisant une déduction guide :
<code class="cpp">template <typename... Ts> struct debug { debug(Ts&&... ts, const std::source_location& loc = std::source_location::current()); }; template <typename... Ts> debug(Ts&&...) -> debug<Ts...>;</code>
Cela permet des appels tels que :
<code class="cpp">int main() { debug(5, 'A', 3.14f, "foo"); }</code>
Conclusion :
Grâce à l'utilisation de guides de déduction, les programmeurs C peuvent en toute transparence incorporez std::source_location dans des fonctions de modèle variadiques pour capturer sans effort les informations de contexte d'appel de fonction.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!