C++:是否可以有一个模板类来表示对资源的条件引用



因此,有时我希望对象具有对共享资源的引用(比如A类型),或者具有自己的A副本。

此外,对象可能发现自己被插入并被操纵在容器(vectorlistset)内部。

到目前为止,我所知道的是,如果我有一个要在容器中的多态类型,我将希望使用unique_ptr的实现。因此,对于拥有A的类HasAnA,它能够被放置在容器中,同时仍然允许其A也是B(在这种情况下,BA的派生类),它必须是这样的:

class A {
virtual void a() { std::cout << "A" << endl; }
payloadA payload;
}; 
class B: public A {
void a() { std::cout << "A(B)" << endl; }
void b() { std::cout << "B" << endl; }
payloadB payload;
};
class HasAnA {
std::unique_ptr<A> my_A; // this allows me to build a std::vector<HasAnA>
OtherStuff my_other_stuff;
};

这太棒了,我正在寻找的是如何实现一个我将称之为RefersAnA的类。我希望RefersAnA要么拥有自己的a,要么指其他人拥有的a。

让我们看看。

class RefersAnA {
std::unique_ptr<A> my_A; // represents my own A: when I die, this A is dealloc'd
A* not_my_A;             // someone else's A. 
OtherStuff my_other_stuff;
RefersAnA () {
// in here is code that would skip initializing my_A if a valid A* was provided.
}
};

对我来说,这并不像我希望的那样友好。我可以制作某种模板类来抽象"要么是资源的唯一ptr,要么是资源中的原始ptr"的概念吗?它需要一个比特来说明它是两个比特中的哪一个,以及一个指针。

这里有一个想法:

struct RefersOrOwns
{
std::unique_ptr<T> own;
T & ref;
RefersOrOwns() : own(new T), ref(*own) { }
RefersOrOwns(T & t) : ref(t) { }
};

(我当然更喜欢own(make_unique<T>()),而不是own(new T),但这是另一个问题。)

相关内容

最新更新