Tôi đang cố gắng để đưa các thành ngữ sao chép và hoán đổi thành một mixin tái sử dụng:tái sử dụng sao chép và hoán đổi thành ngữ
template<typename Derived>
struct copy_and_swap
{
Derived& operator=(Derived copy)
{
Derived* derived = static_cast<Derived*>(this);
derived->swap(copy);
return *derived;
}
};
tôi dự định nó được trộn lẫn trong qua 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";
}
};
Tuy nhiên, một thử nghiệm đơn giản cho thấy rằng nó không phải đang làm việc:
Foo x;
Foo y;
x = y;
chỉ in "mặc định" này hai lần, không phải "sao chép" hay "hoán đổi" được in ra. Tôi đang thiếu gì ở đây?
lẽ trình biên dịch được cung cấp phiên bản của riêng mình của 'operator = 'kể từ khi bạn là thiếu một trong lớp 'Foo' của bạn? Có lẽ bạn sẽ phải làm 'Foo :: operator =() {return copy_and_swap();}' (mã giả)? – RedX