Situation hatWie bewegen Semantik für eine Klasse-Vorlage zu unterstützen, die einen Verweis
Ich bin eine Klassenvorlage logic
entwerfen, die Move-Semantik unterstützt. logic
hat einen Vorlagenparameter Visitor
und ein Referenzelement, dessen Typ Visitor&
ist. Das ist ein Bibliothekscode.
Benutzer erbt die Klassenvorlage logic
und übergibt einen benutzerdefinierten Besucher wie my_visitor
. Der benutzerdefinierte Besucher kann bewegliche Mitglieder enthalten. Zum Beispiel hat my_visitor
ein Element v
, dessen Typ std::vector
ist.
Problem
Siehe test2()
. Wenn ich my_logic verschiebe, wird my_visitor::v
wie erwartet verschoben. logic<Visitor>::vis
bezieht sich jedoch auf das verschobene Objekt. Gibt es eine gute Möglichkeit, auf das bewegte Objekt zu verweisen?
#include <iostream>
#include <vector>
// Library code
template <typename Visitor> // Concept: Visitor should have visit()
struct logic {
logic(Visitor& v):vis(v) {}
void execute() {
vis.visit();
}
// Other APIs
Visitor& vis;
// Other member variables...
};
// User code
struct my_visitor {
my_visitor() { v.push_back(42); }
void visit() {
std::cout << "expected 1, actual " << v.size() << std::endl;
}
std::vector<int> v;
};
// User inherits all logic's APIs
struct my_logic : logic<my_visitor> {
my_logic():logic<my_visitor>(mv) {}
my_visitor mv;
};
void test1() {
std::cout << "test1" << std::endl;
my_logic m;
m.execute();
}
void test2() {
std::cout << "test2" << std::endl;
my_logic m1;
{
my_logic m2(std::move(m1)); // logic::vis refers to moved from my_visitor...
m2.execute();
}
}
int main() {
test1();
test2();
}
Sie müssen Ihren Move-Konstruktor für 'my_logic' implementieren (und wahrscheinlich Bewegungszuweisung löschen). – Jarod42