Implitzite Konvertierung von std::vector<std::shared_ptr<int>> nach std::vector<std::shared_ptr<const int>>?
-
Hallo zusammen,
kann man etwas tun, damit Zeile 12 so funktioniert wie Zeile 11 das tut?#include <memory> #include <vector> typedef std::shared_ptr<int> IntPtr; typedef std::vector<IntPtr> IntPtrs; typedef std::shared_ptr<const int> ConstIntPtr; typedef std::vector<ConstIntPtr> ConstIntPtrs; int main() { IntPtr intPtr; IntPtrs intPtrs; ConstIntPtr constIntPtr(intPtr); ConstIntPtrs constIntPtrs(intPtrs); }Bei einer eigenen Klasse würde man natürlich den conversion operator überladen können. Geht das in diesem Fall hier mit einer freien Funktion?
Gruß
Dobi
-
Dobi schrieb:
Geht das in diesem Fall hier mit einer freien Funktion?
Dann wär das keine implizite, sondern eine Explizite Konversion.
-
Willst du eine Kopie machen, wie im Beispiel dargestellt?
Dann schreib doch einfachConstIntPtrs constIntPtrs(intPtrs.begin(), intPtrs.end());Eine Referenz o.ä. kannst du sowieso unter keinen Umständen bekommen.
-
Ok, also wie im ersten Post geht's nicht, sondern nur so?
#include <memory> #include <vector> #include <iterator> #include <algorithm> typedef std::shared_ptr<int> IntPtr; typedef std::vector<IntPtr> IntPtrs; typedef std::shared_ptr<const int> ConstIntPtr; typedef std::vector<ConstIntPtr> ConstIntPtrs; ConstIntPtrs Constify(IntPtrs intPtrs) { ConstIntPtrs result; result.reserve(intPtrs.size()); std::transform(std::begin(intPtrs), std::end(intPtrs), std::back_inserter(result), [](IntPtr intPtr) -> ConstIntPtr { return intPtr; }); return result; } int main() { IntPtr intPtr; IntPtrs intPtrs; ConstIntPtr constIntPtr(intPtr); ConstIntPtrs constIntPtrs(std::begin(intPtrs), std::end(intPtrs)); ConstIntPtrs constIntPtrsExplicit(Constify(intPtrs)); }@asdfmasodrfgmy: Ja, ich will eine Kopie machen.
-
Dobi schrieb:
Ok, also wie im ersten Post geht's nicht, sondern nur so?
Nö, passender Ctor wurde dir schon vom Vorposter gezeigt

-
Jo, den hab ich in Zeile 23 ja auch benutzt. Hätte es irgendwie kennzeichnen sollen.

Aber OK, so ist's ja auch echt einfach. Danke.