Maison > Article > développement back-end > Existe-t-il un équivalent « modèle » en 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&) {} // do whatever }; template <typename T> foo<T> make_foo(const T& 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
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!