Bonsoir,

Soit une architecture assez simple comme celle decrite ci-dessous

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
class A
{
.....
};
 
template <class TYPE>
class B
{
public :
	void Set(SmartPtr<Image<TYPE>> p_pData) {
		m_pData = p_pData;
	};
 
 
protected :
	SmartPtr<Image<TYPE>> m_pData;
};
a l'utilisation, je fais quelque chose comme ca (dans un autre composant)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
template <class TYPE>
void Component::SetImage(SmartPtr<TYPE> p_pImg)
{
	SmartPtr<B<TYPE>> l_pB(new B<TYPE>());
	l_pB->Set(p_pImg);
	m_pA = l_pB;// m_pA est un SmartPtr<A>
}
Mon probleme se pose pour acceder a une donnée de B:m_pData qui ne depend pas non dependante du type TYPE mais qui necessite que je connaisse le type reel
donc j'en suis a écrire une méthode

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
ImageData Component::GetImageData() const
{
	{
		SmartPtr<B<BYTE>> l_pB = dynamic_pointer_cast<B<BYTE>>(m_pA);
		if (l_pB) return *l_pB;	
	}
	{
		SmartPtr<B<WORD>> l_pB = dynamic_pointer_cast<B<WORD>>(m_pA);
		if (l_pB) return *l_pB;	
	}
	{
		SmartPtr<B<RGBA>> l_pB = dynamic_pointer_cast<B<RGBA>>(m_pA);
		if (l_pB) return *l_pB;	
	}
 
	return ImageData(0);	// invalid ImageData
}
J'aimerai remplacer les 3 blocs 'identiques' par une boucle sur les types, a la maniere de boost::mpl ou autre chose.
Quelque chose qui donnerait

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
ImageData Component::GetImageData() const
{
	for type in {BYTE,WORD,RGBA) {
		SmartPtr<B<type>> l_pB = dynamic_pointer_cast<B<type>>(m_pA);
		if (l_pB) return *l_pB;	
	}
 
	return ImageData(0);	// invalid ImageData
}
Quelqu'un sait-il si c'est possible de faire ca et si oui m'expliquer comment faire ?

merci
Vincent