(j'avais zappé ton code)
Oui c'est une possibilité mais c'est pas ce qu'ils ont choisi pour la MPL. Les metafunctions prennent des types en paramètres, les "high order" metafunction n'échappent pas à la régle.
Du coup ce genre de chose n'est pas valide :
Code:
1 2
|
typename mpl::transform<vec1, vec2, mpl::plus>::type foo; |
parce que mpl::plus est une classe template et non un type et que ta metafunction attend un type.
Mais tout problème peut se résoudre en introduisant une couche d'abstraction (tm). On utilise une metafunction class qui à cette gueule :
Code:
1 2 3 4 5
| struct plus_
{
template <class T1, T2>
struct apply : mpl::plus<T1,T2> {};
}; |
et voilà on a un type qu'on peut utiliser avec notre high order metafunction :
Code:
typename mpl::transform<vec1, vec2, plus_>::type foo;
Bon ok ça va vite devenir lourd, heureusement les lambda sont là :
Code:
1 2
|
typename mpl::transform<vec1, vec2, mpl::plus<_1,_2> >::type foo; |