形势如何支持具有参考
我设计,支持移动语义类模板logic
类模板移动语义。 logic
具有模板参数Visitor
,并且类型为Visitor&
的参考成员。这是一个库代码。
用户继承类模板logic
并传递一个自定义访问者,如my_visitor
。自定义访问者可能包含可移动成员。例如,my_visitor
具有构件v
这类型是std::vector
。
问题
见test2()
。当我移动my_logic时,my_visitor::v
按预期移动。但是,logic<Visitor>::vis
指的是从对象移出。有没有什么好的方法可以引用移动到的对象?
#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();
}
您必须实现'my_logic'的移动构造函数(并可能删除移动赋值)。 – Jarod42