is_copy_assignable ist nicht genug!
-
Ich leide gerade darunter, dass
std::is_copy_assignable <std::vector <std::unique_ptr <A>>>::valuewahr 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>>::vectorauftritt, sondern weil Besagter wiederum auf nicht-existente Funktionen zuzugreifen versucht, was leider nicht SFINAE-friendly ist. Eine Möglichkeit wäre es, ein eigenesis_copy_assignablezu 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 }