Utilisation de std::source_location dans les fonctions de modèle variadique
Lors de l'utilisation de la fonctionnalité C 20 std::source_location pour capturer des informations contextuelles dans un modèle variadique fonctions, un défi se pose pour déterminer où placer le paramètre source_location.
Tentatives infructueuses
Les tentatives incorrectes incluent :
Paramètres variadiques à la fin :
<code class="cpp">template<typename... Args> void debug(Args&&... args, const std::source_location& loc = std::source_location::current());</code>
Cela échoue car les paramètres variadiques doivent être à la fin.
Insertion de paramètres :
<code class="cpp">template<typename... Args> void debug(const std::source_location& loc = std::source_location::current(), Args&&... args);</code>
Cela perturbe l'appelant, ce qui entraînerait une erreur lors du passage d'arguments réguliers (par exemple, debug(42);).
Solution : Guide de déduction
Le problème peut être résolu en ajoutant un guide de déduction au premier formulaire :
<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>
Ce guide de déduction déduit les paramètres du modèle en fonction sur les arguments de la fonction, permettant de placer le paramètre source_location à la fin.
Test et démonstration
<code class="cpp">int main() { debug(5, 'A', 3.14f, "foo"); }</code>
Démo en direct : https://godbolt.org /z/n9Wpo9Wrj
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!