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
3 Réponses :
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);
}
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.
}
Pourquoi avez-vous introduit fun2 code>?
@MarekR, pour montrer comment le code et le code indépendant de type dépendant de type peut être divisé.
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;
}
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 code> 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; code> est pur fantasy; Ce n'est pas un code valide à distance. Il n'y a pas d'arguments surFUNC1 code>, de sorte que l'appelant est entièrement responsable de la fourniture deA code> ouB code> 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 i>? Pourquoi pas seulement utiliser
Func1 code> avec deux surcharges:VOID FUNC1 (données) CODE> etVOID FUNC1 (B DATA) CODE>?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 code> etB code>. Il serait possible de le faire fonctionner pour n'importe quel type, mais cela vaut-il?