Maison >développement back-end >C++ >Les fonctions de modèle peuvent-elles être transmises comme arguments de modèle en C ?

Les fonctions de modèle peuvent-elles être transmises comme arguments de modèle en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-02 18:44:02464parcourir

Can Template Functions Be Passed as Template Arguments in C  ?

Fonction de modèle comme argument de modèle

En C, la programmation générique peut être réalisée via des pointeurs de fonction ou des modèles. Bien que les modèles garantissent les appels de fonctions en ligne, ils sont confrontés à des limites lorsqu'ils traitent eux-mêmes des fonctions génériques.

Énoncé du problème

Considérez le code suivant :

<code class="cpp">void a(int) {
    // do something
}
void b(int) {
    // something else
}

template<void (*param)(int) >
void function() {
    param(123);
    param(456);
}</code>

Bien que cette fonction de modèle simplifie la répétition entre fonction1 et fonction2, cela devient problématique lorsque a et b sont eux-mêmes génériques :

<code class="cpp">template<typename T>
void a(T t) {
    // do something
}

template<typename T>
void b(T t) {
    // something else
}

template< ...param... > // ???
void function() {
    param<SomeType>(someobj);
    param<AnotherType>(someotherobj);
}</code>

Solution : Paramètres du modèle de modèle

Pour définir la fonction générique avec les fonctions génériques a et b, nous devons utiliser des paramètres de modèle de modèle. Cependant, passer ces fonctions directement sous forme de types n’est pas possible. Par conséquent, nous utilisons une solution de contournement avec des structures factices :

<code class="cpp">template<typename T>
struct a {
    static void foo(T = T()) {}
};

template<typename T>
struct b {
    static void foo(T = T()) {}
};

template<template<typename P> class T>
void function() {
    T<SomeObj>::foo();
    T<SomeOtherObj>::foo();
}</code>

En spécifiant le paramètre de modèle de modèle comme structures factices a et b, nous pouvons instancier la fonction modèle et appeler les méthodes foo génériques dans la 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!

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