Itérer sur des types de données
Bonsoir,
Soit une architecture assez simple comme celle decrite ci-dessous
Code:
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:
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:
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:
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