0
votes

Vérifiez le paramètre Type de modèle, pendant le temps de compilation, pour le fonctionnement spécifique de type

Tout d'abord, le code est limité à C ++ 11, donc je ne peux donc pas utiliser si consexpr em>

suivi est mon extrait de code d'échantillon: P>

1: B,D,E,F has no member a & b
 & 
2: A,D,E,F has no member key & val
 &
3. A, B has no member n1 & n2


5 commentaires

Quelle partie de ce que vous essayez d'accomplir ne peut être faite par la spécialisation à l'ancienne, simple et la plus simple?


Une utilisation relativement réaliste, y compris un principal serait formidable, car jusqu'à présent, je ne vois aucune raison de faire quoi que ce soit mais fournira deux fonctions différentes. STD :: COUT << T.A << T.B; est pur fantasy; Ce n'est pas un code valide à distance. Il n'y a pas d'arguments sur FUNC1 , de sorte que l'appelant est entièrement responsable de la fourniture de A ou B comme argument de modèle au point d'appel. Si vous allez faire cela, vous pouvez aussi bien avoir deux fonctions différentes à appeler en premier lieu, leur spécialisation ou autrement.


Après votre mise à jour, demandez-vous maintenant pourquoi il vous suffit de modeler l'un de ce du tout ? Pourquoi pas seulement utiliser Func1 avec deux surcharges: VOID FUNC1 (données) et VOID FUNC1 (B DATA) ?


Dans votre exemple, vous n'avez pas besoin de modèles du tout. Définissez simplement 2 surcharges de Func1.


De combien de généricité avez-vous besoin? La réponse que vous avez est bien pour A et B . Il serait possible de le faire fonctionner pour n'importe quel type, mais cela vaut-il?


3 Réponses :


1
votes

Vous devez écrire des spécialisations de la fonction pour les deux types de votre souhait de l'utiliser.

#include<iostream>

class A{
 public:
    int a;
    int b;
};

class B{
 public:
    int key;
    int val;
};

template<typename T>
void func1(T);

template<>
void func1<A>(A arg) {
    std::cout<<"A"<<std::endl;
    std::cout<<arg.a<<arg.b;
}

template<>
void func1<B>(B arg) {
    std::cout<<"B"<<std::endl;
    std::cout<<arg.key<<arg.val;
}

int main(){
A a;
func1(a);

B b;
func1(b);

}


0 commentaires

2
votes

Vous pouvez utiliser une surcharge de fonction et éviter le modèle de fonction complètement.

void func1(A a)
{
   // Type dependent code.
}

void func1(B a)
{
   // Type dependent code.
}

template <typename T>
void func2(T t)
{
   // Type independent code.
}

template <typename T>
void func(T obj)
{
   func1(obj);   // Call function that uses type dependent code.
   func2(obj);   // Call function that uses type independent code.
}


2 commentaires

Pourquoi avez-vous introduit fun2 ?


@MarekR, pour montrer comment le code et le code indépendant de type dépendant de type peut être divisé.



1
votes

Une surcharge simple fait le travail.

template <typename T>
void func1(T data)
{
    std::cout << data.n1 << data.n2;
}

void func1(A data)
{
    std::cout << data.a << data.b;
}

void func1(B data)
{
    std::cout << data.key << data.val;
}


0 commentaires