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 einfach

    ConstIntPtrs 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.


Anmelden zum Antworten