Maison >développement back-end >C++ >Comment utiliser `std::source_location` dans les fonctions de modèle variadique ?

Comment utiliser `std::source_location` dans les fonctions de modèle variadique ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-30 19:08:451065parcourir

How to Use `std::source_location` in Variadic Template Functions?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn