3878Fermer3880
WarptenLe 15/09/2018 à 10:36
En gros ce qu'il manque pour pouvoir etre addressable dans tous les sens, c'est juste

template <template <typename... Args> typename Base> struct rebinder { template <typename... Map> using bound = Base<Map...>; };
Et paf, plus besoin de base vide, ni de specialisation partielle.

(Actuellement, si tu fais ca, on te dit que le type passe en argument a rebinder n'est pas un class template, ce qui est vrai, puisque l'info est perdue - template et type c'est pas pareil:

67:100: error: template argument for template template parameter must be a class template or type alias template

template <typename K2, typename V2, typename A2 = rebound_allocator_type<typename rebinder<pair_type>::template bound<const K2, V2>>

)

J'irais pas jusqua dire que c'est de la magie noire mais clairement si tu fais pas ce genre de choses proprement, 3 jours plus tard tu comprend plus rien

l'idee du snippet c'est avec un Container<A, B, C, ...>, obtenir Container<A2, B2, C2, ...> sachant que la fonction de transformation est fournie. Tu peux faire ca de facon brutale avec plein d'overload mais ca ne couvrira de facto pas les types conteneur de l'user. Avec ces traits, tout ce que l'user a a afaire c'est a) specialiser le template container-traits ou b) ajouter les typedef kivonbien