Ich habe diese einfache Funktion mit einem Template-Template-Parameter. Es sollte einen STL-Container nehmen, das Smart-ptr zu einem normalen ptr konvertieren (es ++ 03 C ist Projekt, aber ich bin auch in der Antwort interessiert für C++ 11):Vorlage Template-Klasse, eine Funktion aufrufen, wenn es existiert
template <template <typename _T, typename = std::allocator<_T> > class Container>
static Container<T*> GetRawPtrContainer(const Container<SmartPtr<T> >& input_container)
{
Container<T*> container;
for(typename Container<SmartPtr<T> >::const_iterator it = input_container.begin();
it != input_container.end();
it++)
{
container.push_back(it->ptr);
}
return container;
}
Dies ist eine statische Elementfunktion der Klasse SmartPtr<T>
.
Sie sehen hier, das alles ist push_back
alle Elemente von input_container
zu einem anderen und zurück.
Sie haben vielleicht bemerkt, dass, wenn der Eingang std::vector
ist, dann gibt es ein Performance-Problem mit O(1)
Einfügungen, während dies für std::list
und std::deque
in Ordnung ist. Also, was Ich mag würde zu tun ist, dieser Aufruf vor der Schleife, wenn es möglich ist (entschieden zur Compile-Zeit):
container.reserve(input_container.size());
Wie kann ich das tun?
Es tut mir leid, können Sie ein Beispiel zeigen, wo das C++ 03 Beispiel für das Problem arbeiten würde, das ich gestellt habe? –
Einfach so: https://pastebin.com/c4NARK3e – ACB
Könnten Sie das zur Antwort hinzufügen? Die Firewall meines Unternehmens blockiert pastebin. –