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
Mary-Kate Olsenoriginal
2024-12-09 00:04:15804parcourir

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;
};

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;
};

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!

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