Je trouve pas ca si pire moi

apres y a des trucs cons lies a la fatigue, par exemple
pack_arity<Container<Args...>>::arity devient
sizeof...(Args)et termine

et je vous ai pas montre la version qui rebind un ensemble de Target sur un ensemble de Source

p-ex
std::unordered_map<float, int, ...>mine de rien c'est pas evidement, si je veux remapper en
std::unordered_map<int, float, ...> je peux pas le faire sequentiellement sur un pack du genre <int, float> pcq jvais me retrouver avec:
premiere passe:
unordered_map<int, int, ...> (on assigne
int a
float)
deuxieme passe:
unordered_map<float, float, ...> (on assigne
float a
int)
au lieu de
unordered_map<float, int>du coup faut se trimballer (pour chaque niveau de recursion!) un ensemble d'offets a ignorer lors de rebind successif. Bref, une vrai purge

Pour le moment j'ai ca
Le lisp c'est mieux :D
// Replaces every occurence of Source in Args by Target.
template <typename Source,
typename Target,
template <typename...> typename Container,
typename... Args,
size_t... Exclusion>
struct rebind_single<Source, Target, Container<Args...>, Exclusion...> {
private:
template <size_t I>
using corrected_type_i = typename std::conditional<
has_element<I, Exclusion...>::value, // If we were told to ignore this position in the pack ...
nth_element_t<I, Args...>, // Then just assign the type and move on
typename std::conditional< // Otherwise ...
std::is_same< // If we need to map it
Source,
nth_element_t<I, Args...> // Obtains a lvalue-ref-removed type (std::get returns T&&)
>::value,
// Forward type modifiers from the source to the raw target type
typename forward_modifiers<
nth_element_t<I, Args...>,
typename std::decay<Target>::type // Retrieve a decayed type to make sure the caller doesn't fuck up
>::type,
typename rebind_single< // We don't need to map it
Source, // Try to see if this type is a template and needs
Target, // remapping too.
nth_element_t<I, Args...>
>::corrected_type
>::type
>::type;
template <size_t... Is>
constexpr static auto rebind_all(std::index_sequence<Is...>) {
return Container<corrected_type_i<Is>...>{};
}
public:
template <size_t... Is>
using corrected_types = Container<corrected_type_i<Is>...>;
using corrected_type = decltype(rebind_all(std::make_index_sequence<sizeof...(Args)>()));
};
faut encore que je trouve comment garder les exclusions des types enfant