Maison  >  Article  >  développement back-end  >  Existe-t-il un équivalent « modèle » en C ?

Existe-t-il un équivalent « modèle » en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-06 05:26:02254parcourir

Is There a `template` Equivalent in C  ?

Pouvez-vous imiter un modèle?

Les capacités de métaprogrammation de modèles de C permettent aux développeurs de créer du code puissant et efficace. Cependant, dans certains scénarios, transmettre des arguments aux modèles peut s'avérer fastidieux. Considérez le code suivant :

<code class="cpp">struct Foo {
  template<class T, T X>
  void bar() {
    // do something with X, compile-time passed
  }
};

struct Baz {
  void bang() {}
};

int main() {
  Foo f;
  f.bar<int, 5>();
  f.bar<decltype(&Baz::bang), &Baz::bang>();
}</code>

Dans cet exemple, nous devons spécifier explicitement les types et transmettre les valeurs réelles comme arguments à la barre de modèles.

Est-il possible de simplifier cette syntaxe ? Pourrions-nous l'exprimer ainsi :

<code class="cpp">struct Foo {
  template<auto X>
  void bar() {
    // do something with X, compile-time passed
  }
};

struct Baz {
  void bang() {}
};

int main() {
  Foo f;
  f.bar<5>();
  f.bar<&Baz::bang>();
}</code>

La réponse :

Malheureusement, C ne fournit pas de moyen direct pour réaliser cette syntaxe. L'alternative la plus proche est les macros :

<code class="cpp">#define AUTO_ARG(x) decltype(x), x

f.bar<AUTO_ARG(5)>();
f.bar<AUTO_ARG(&Baz::bang)>();</code>

Une autre alternative : les générateurs

Si vous cherchez principalement un moyen d'éviter de spécifier explicitement des types , une fonction génératrice peut être une solution viable :

<code class="cpp">template <typename T>
struct foo {
    foo(const T&amp;) {} // do whatever
};

template <typename T>
foo<T> make_foo(const T&amp; x) {
    return foo<T>(x);
}</code>

Au lieu d'écrire :

<code class="cpp">foo<int>(5);</code>

Vous pouvez utiliser :

<code class="cpp">make_foo(5);</code>

Cela permet le type d'argument à déduire, simplifiant le code. Notez que cette approche n'émule pas directement le modèle syntaxe, mais il fournit une alternative pratique pour transmettre des arguments aux modèles.

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