Maison > développement back-end > C++ > Comment puis-je obtenir des types de retour flexibles avec le polymorphisme statique C (CRTP) et éviter les erreurs de compilation ?

Comment puis-je obtenir des types de retour flexibles avec le polymorphisme statique C (CRTP) et éviter les erreurs de compilation ?

Mary-Kate Olsen
Libérer: 2024-12-09 00:04:15
original
806 Les gens l'ont consulté

How Can I Achieve Flexible Return Types with C   Static Polymorphism (CRTP) and Avoid Compilation Errors?

Polymorphisme statique C (CRTP) à l'aide de typesdefs de classe dérivés

Le modèle de modèle curieusement récurrent (CRTP) permet le polymorphisme statique en C, mais cela devient difficile lorsque l'on vise à modifier les types de retour de fonction en fonction du type dérivé. Bien que CRTP puisse généralement déduire le type dérivé, le code suivant rencontre des problèmes de compilation dans MSVC 2010 :

template <typename derived_t>
class base {
public:
    typedef typename derived_t::value_type value_type;
};

template <typename T>
class derived : public base<derived<T>> {
public:
    typedef T value_type;
};
Copier après la connexion

Cette erreur se produit car la classe dérivée est incomplète lorsqu'elle est utilisée comme paramètre de modèle pour la classe de base dans la base de données. liste de classe. Pour résoudre ce problème, une solution de contournement courante consiste à utiliser un modèle de classe de traits :

// Declare the base_traits class template
template <typename derived_t>
struct base_traits;

// Define the base class
template <typename derived_t>
struct base {
    typedef typename base_traits<derived_t>::value_type value_type;
};

// Define the derived class
template <typename T>
struct derived : public base<derived<T>> {
    typedef typename base_traits<derived<T>>::value_type value_type;
};

// Specialization of base_traits for derived
template <typename T>
struct base_traits<derived<T>> {
    typedef T value_type;
};
Copier après la connexion

En spécialisant le modèle base_traits pour les types dérivés souhaités, vous pouvez définir les membres requis, y compris les types de retour personnalisés pour des fonctions telles que foo (). Cette technique permet un polymorphisme statique avec plus de flexibilité dans les types de retour tout en évitant les erreurs de compilation.

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