is_copy_assignable ist nicht genug!



  • Ich leide gerade darunter, dass

    std::is_copy_assignable <std::vector <std::unique_ptr <A>>>::value
    

    wahr ist.

    EDIT: Folgendes ist nur ein beispiel! Wenn man das nicht erkennt versteht man warscheinlich nicht die Kommentare, oder mein Post.

    #include <iostream>
    #include <memory>
    #include <type_traits>
    #include <vector>
    
    using namespace std;
    
    class A {virtual void f() = 0;};
    
    class B : public A {void f() override {}};
    
    int main()
    {
        std::cout << std::is_copy_assignable <std::vector <std::unique_ptr <A>>>::value << "\n"; // -> 1
        std::vector <std::unique_ptr <A>> a;
        a = {}; // booommm!! (Die Zeile sollte nur einkompiliert werden, wenn ich a auch {} zuweisen kann.)
    
        return 0;
    }
    

    Ich brauche eine andere Lösung, da das copy assignment offensichtlich nicht kompiliert. => Mein AssignIfAssignable kompiliert nicht.



  • Ich glaube nicht, dass sich das so im allgemeinen Fall lösen lässt, weil der Compilerfehler nicht etwa wegen einem fehlenden std::vector<std::unique_ptr<A>>::vector auftritt, sondern weil Besagter wiederum auf nicht-existente Funktionen zuzugreifen versucht, was leider nicht SFINAE-friendly ist. Eine Möglichkeit wäre es, ein eigenes is_copy_assignable zu implementieren, das auch die Template-Argumente von Containern überprüft:

    #include <iostream>
    #include <memory>
    #include <type_traits>
    #include <vector>
    
    template<typename T>
    struct is_copy_assignable : std::is_copy_assignable<T>{};
    template<typename T, typename alloc_t>
    struct is_copy_assignable<std::vector<T, alloc_t>> : std::is_copy_assignable<T>{};
    
    int main()
    {
        std::cout << is_copy_assignable<std::vector<int>>::value << '\n'; // 1
        std::cout << is_copy_assignable<std::vector<std::unique_ptr<int>>>::value << '\n'; // 0
    }
    

Anmelden zum Antworten