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 sur
FUNC1 code>, de sorte que l'appelant est entièrement responsable de la fourniture de
A code> ou
B 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> et
VOID 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> et
B code>. Il serait possible de le faire fonctionner pour n'importe quel type, mais cela vaut-il?