3893Fermer3895
WarptenLe 16/09/2018 à 17:25
Je trouve pas ca si pire moi grin

apres y a des trucs cons lies a la fatigue, par exemple

pack_arity<Container<Args...>>::arity devient

sizeof...(Args)
et termine grin

et je vous ai pas montre la version qui rebind un ensemble de Target sur un ensemble de Source grin 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 cheeky

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