Я пытаюсь избежать довольно сложной цепочки наследования для набора простых старых структур данных, но мне нужно хранить их все в векторе + долевое владение с вызывающим.
Struct A {};
Struct B {};
using TInstruction = std::variant<A, B>;
struct holder {
std::vector<std::shared_ptr<TInstruction>> items;
};
static holder h;
// Every individual TInstruction gets its own add function, for validation purposes
void add(std::shared_ptr<A> a) {
// Somehow add this to h, while still sharing ownership with the caller
// h.emplace_back(???)
}
int main() {
holder h;
auto a = std::make_unique<A>();
auto b = std::make_unique<B>();
add(a);
// add(b) // not implemented
}
I У меня был умеренный (но досадно слабый) успех со следующими изменениями в исходной идее:
- Использовать общие указатели внутри варианта, т.е.
using TInstruction = std::variant<std::shared_ptr<A>, std::shared_ptr<B>>
- Принятие std :: weak_ptr в
add()
и используйте .lock()
, чтобы превратить его в std :: shared_ptr
Я не против # 2 (мне кажется, что это может быть правильный способ сделать это ), но сохранение shared_ptr внутри варианта внутри «снаружи» приводит к очень подробному коду и сопоставлению с образцом.
Возможно ли это вообще? По сути, я хочу изменить тип общего указателя, но все же express идею совместного владения.