Bonjour,

Je réutilise du code de mon professeur qui a codé un peu de programmation générique. Je vais essayer de ne mettre que le code important pour le sujet:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
  std::vector<double> monte_carlo(int n, Gen G)
{
	std::vector<double> result(3,0);
	double x;
	for (int j = 0; j < n; j++) {
		x = G();
		result[0] += x;
		result[1] += x*x;
		if(j%1000==0){std::cout << j<< std::endl;}
	}
	result[0] /= (double) n;
	result[1] = (result[1] - n*result[0]*result[0])/(double)(n-1);
	result[2] = 1.96*sqrt(result[1]/(double) n);
	return result;
}
 
/****** Composition d'une fonction et d'une VA ************/
template <class _Result>
struct generator
{
	typedef _Result result_type;
};
 
template <typename Fct, typename VA>
struct compose_t : public generator< typename Fct::result_type >
{
	compose_t(Fct f, VA X) : f(f), X(X) {};
	typename Fct::result_type operator()() {
		return f(X());
	};
	private:
		Fct f; VA X;
};
 
template <typename Fct, typename VA>
inline compose_t<Fct, VA>
compose(Fct f, VA X) {
    return compose_t<Fct, VA>(f, X);
};
J'arrive à reutiliser ce code mais j'ai un probleme quand je veux utiliser une classe abstraite (avec des classes filles qui instancie la méthode). En l'occurence j'utilise le code comme ca :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
vector<double> Pricer::Pricing(vector<double> initials,int n, Payoff& pay){
     return monte_carlo(n, compose(pay,VA));
}
VA est une instance d'une classe qui surchage l'opérateur () et renvoie un objet qu'utilise l'operateur() de pay.
PayOff est defini comme cela:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
  struct Payoff:public AllFunctions{
      Payoff(Market mar,vector<double> initials):AllFunctions(mar,initials){}
      virtual double operator()(tabl tab)=0;
};
 
struct Payoff_BLAC:public Payoff{
       double L;
       Payoff_BLAC(double l,Market mar,vector<double> initials):Payoff(mar,initials),L(l){}
       double operator()(tabl tab);
};
le compilateur indique : Nom : pp.png
Affichages : 250
Taille : 11,1 Ko

En résumé le probleme apparait quand je passe à la fonction Pricing une reference d'une classe abstraite plutot directement un object d'une des classe filles qui ne sont pas abstaite.
Je veux faire ca pour pouvoir, de facon assez classique je crois, ne pas avoir à réecrire la fonction Pricing pour chaque classe fille ( la classe mère est une "interface")