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
Libérer: 2024-11-02 18:44:02
original
420 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal