C
Meep Meep @ Balkonien schrieb:
@camper
koenntest du mir erklaeren was genau du da gemacht hast ? ich glaub meine template kenntnisse sind eingerostet bzw. nicht gut genug.
Ich habe erst mal dein Template-Argument T entfernt, das ist redudant, wenn ein anderer Templateparamter einen Container mit diesem Value-typ beshreiben soll. Ansonst ist das eine einfache Angelegenheit, falls der Container eine Instanz eines Templates mit zwei Typparametern (bei Standardcontainern wären das vector, deque, list, forward_list) ist, wird die erste Spezialisierung genommen. Ein paar zusätzlich Checks sind nur dafür da, offensichtliche Nicht-Container abzufangen, um eine klarere Fehlermeldung zu erhalten.
Meep Meep @ Balkonien schrieb:
@camper
koennte ich nach deinem konstrukt auch eine multimap verwenden ?
Klar. Indem eine entsprechende Spezialisierung geschrieben wirde. Zu beachten ist hierbei, dass ggf. das Compare-argument modifiziert werden muss. Das hängt davon ab, was gewrapped werden soll (Der Key oder der Valuetyp oder beides - nicht gewrapped werden kann allerdings das resultierende pair).
z.B.
template <template <typename, typename, typename, typename> class TT, typename Key, typename T, typename Comp, typename A> // map, multimap
struct ordered_wrapped_container4
{
struct new_comp : Comp
{
bool operator()(const wrapped<Key>& lhs, const wrapped<Key>& rhs) const { return Comp::operator()( unwrap( lhs ), unwrap( rhs ) ); }
};
typedef TT<wrapped<Key>, T, new_comp, typename A::template rebind<std::pair<const wrapped<Key>, T>>::other> type;
};
template <template <typename, typename, typename, typename> class TT, typename Key, typename Hash, typename Pred, typename A> // unordered_set, unordered_multiset
struct unordered_wrapped_container4; // todo
template <template <typename, typename, typename, typename> class TT, typename A, typename B, typename C, typename D> // 4 Typargumente: erwischt map, multimap, unordered_set, unordered_multiset
struct wrapped_container<TT<A, B, C, D>> : std::conditional<std::is_same<A, typename TT<A, B, C, D>::value_type>::value, unordered_wrapped_container4<TT, A, B, C, D>, ordered_wrapped_container4<TT, A, B, C, D>>::type
{};