1. Jo, wäre auch eine Möglichkeit, wohl grade einfach nicht daran gedacht.Quote:
Warum so kompliziert void etc. ausschalten? Es reicht, ProxyRet<void> zu spezialisieren und ProxyRet<const void> etc. davon ableiten zu lassen.
std::move ist in utility definiert. std::enable_if in type_traits.
Compare (InputIterator first, InputIterator last): Die Benennung last ist irreführend. last wird niemals dereferenziert.
Minimum und Maximum sind einfacher mit std::min_element und std::max_element zu implementieren, Signal::size mit std::count_if.
ProxyRet <R> operator () (const Args &... args) const: Was ist mit "perfect forwarding"?
Warum muss ich die "custom-compare Funktionen" in eine Klasse packen, Compare nennen und zu Templatefunktionen machen? Warum nicht das Konzept der Funktionsobjekte wie in der Standardbibliothek unterstützen?
_generic_invoke(const FuncT& function): Wie wäre es mit remove_if?
Es müsste so gehen, ich habe es nicht getestet:mutable und const heißen beide "ist thread-sicher", oder sollten es. Auch ein konstantes Objekt (oder const T&) braucht ein veränderliches Objekt der Klasse std::mutex.Code:template <typename FuncT> void _generic_invoke (const FuncT & function) const { Detail::CallLock g (m_callLock); m_connections.remove_if ([& function] (const std::shared_ptr <Detail::ConnectionBase <signature_t>> & connection) { if (! connection->connected ()) return true; function (connection->connectedSlot); return false; }); }
2. Ups, type_traits vergessen.
3. Vielleicht, nennt boost und stl aber genauso.
4. Stimmt, die fordern nur noch nen algorithm include auf den ich so auch verzichten kann.
5. Perfect forwarding geht hier nicht. Es sind ja mehrere Funktionen, die die Argumente brauchen. Würde es bei der 1. Funktion in einem move resultieren, hätten die restlichen ein leeres Ergebnis, da das Argument gemoved wurde.
6. kA wie meinst du denn? mit ner Predicate Funktion als invoke Argument?
7. Nicht gesehen, dass std::forward_list eine remove_if Funktion anbietet.