Często napotykam nużące konstrukty przenoszenia klas z wieloma zmiennymi składowymi. Wyglądają coś jak poniżej:Delegowanie do domyślnego konstruktora przenoszenia
A(A && rhs) :
a(std::move(rhs.a)),
b(std::move(rhs.b)),
c(std::move(rhs.c)),
d(std::move(rhs.d)) {
some_extra_work();
}
Oznacza to, że wykonywanie wszystkich czynności związanych z konstruktora domyślnego przenieść, a następnie peform trochę przyziemne dodatkowe zadania. Idealnie byłoby delegować do domyślnego konstruktora ruchu, a następnie wykonać dodatkową pracę, jednak sam akt definiowania własnego konstruktora ruchu uniemożliwia zdefiniowanie domyślnej implementacji, co oznacza, że nie ma nic do przekazania.
Czy istnieje dobry sposób na obejście tego anty-wzór?
Trudno powiedzieć na takim poziomie abstrakcji, ale być może można oddzielić 'A' na dwie klasy i umieścić jeden do drugiego? Jeden będzie miał wszystkie domyślne konstruktory, a drugi wykona 'some_extra_work'. Sprawdź * Regułę zero *. – zch
Nie jestem pewien czy to ma zastosowanie, ale czy coś takiego jak 'A (A && rhs, int): A (rhs) {}' nie działa? – Damon
Pomocna może być pośrednia klasa bazowa z domyślnym konstruktorem ruchu. –