gjenbruk av kopi-og-bytt-idiomet

Jeg prøver å sette kopi-og-bytt-idiomet inn i et gjenbrukbart mixin:

template<typename Derived>
struct copy_and_swap
{
    Derived& operator=(Derived copy)
    {
        Derived* derived = static_cast<Derived*>(this);
        derived->swap(copy);
        return *derived;
    }
};

Jeg har tenkt at det skal blandes inn via CRTP:

struct Foo : copy_and_swap<Foo>
{
    Foo()
    {
        std::cout << "default\n";
    }

    Foo(const Foo& other)
    {
        std::cout << "copy\n";
    }

    void swap(Foo& other)
    {
        std::cout << "swap\n";
    }
};

En enkel test viser imidlertid at den ikke fungerer:

Foo x;
Foo y;
x = y;

Dette skriver bare ut "standard" to ganger, verken "kopi" eller "bytt" skrives ut. Hva mangler jeg her?

11
задан fredoverflow 16 August 2011 в 14:48
поделиться