Si vous ne souhaitez pas utiliser boost/C++ 17 tout, pensez à dériver le paramètre de la fonction « doSometing » d'une classe de base, et ne la chassez dynamique le bon objet de classe. Dans ce cas, vous pouvez vérifier à l'exécution que vous avez un pointeur valide.
class param{
public:
virtual ~param(){};
};
template <typename T>
struct specificParam:param{
specificParam(T p):param(p){}
T param;
};
class Foo
{
public:
virtual void doSomething(param* data) = 0;
};
template <typename T>
class Bar : public Foo
{
public:
virtual void doSomething(param* data){
specificParam<T> *p = dynamic_cast<specificParam<T> *>(data);
if (p != nullptr){
std::cout<<"Bar got:" << p->param << "\n";
}
else {
std::cout<<"Bar: parameter type error.\n";
}
}
};
int main(){
Bar<char> obj1;
Bar<int> obj2;
Bar<float> obj3;
specificParam<char> t1('a');
specificParam<int> t2(1);
specificParam<float> t3(2.2);
obj1.doSomething(&t1); //Bar got:a
obj2.doSomething(&t2); //Bar got:1
obj3.doSomething(&t3); //Bar got:2.2
// trying to access int object with float parameter
obj2.doSomething(&t3); //Bar: parameter type error.
}
Le plus simple (mais dangereux!) Façon serait d'utiliser void * pointeur + cast statique
class Foo
{
public:
virtual void doSomething(void* data) = 0;
};
template <typename T>
class Bar:public Foo
{
public:
virtual void doSomething(void* data){
T* pData = static_cast<T*>(data);
std::cout<<"Bar1 got:" << *pData << "\n";
}
};
int main(){
Bar<char> obj1;
Bar<int> obj2;
Bar<float> obj3;
char c = 'a';
int i = 1;
float f = 2.2;
obj1.doSomething(&c); // Bar1 got:a
obj2.doSomething(&i); // Bar1 got:1
obj3.doSomething(&f); // Bar1 got:2.2
//obj2.doSomething(&c); // Very bad!!!
}
pouvez-vous s'il vous plaît être plus précis? Comment utilisez-vous les données dans la fonction? Quelles sont les exigences du type pour les données? Par exemple. y a-t-il seulement quelques classes connues, ou prévoyez-vous d'accepter une classe qui a une méthode spécifique, etc.? – bolov
Votre question doit être réduite un peu. Connaissez-vous la gamme de types, voulez-vous qu'ils soient automatiquement déduits? La réponse la plus simple serait "use void *", une meilleure réponse pourrait être celle de Story Teller. Tout dépend de votre cas. –
Je suis curieux, en regardant les réponses, à propos de la possibilité d'obtenir le même résultat sans avoir à faire de casting sur 'doSomething'. Quelque chose comme encapsuler le type d'une certaine façon sans avoir à faire 'doSomething' un modèle, et récupérer ce type avec un' decltype', c'est-à-dire Type d'une méthode d'usine virtuelle ... – perencia