我正在尝试实现一个通用指针类,它将eighter保存为原始指针或shared_ptr
。我有一个枚举来指示指针对象的内容。
enum class memory_management_t{
raw_pointer,
counted_pointer,
};
指针类是模板类:
template<class T, memory_management_t MEM>
class pointer;
会重载->
和*
- 运算符。
现在我的问题是,如果一个类的虚拟成员函数想要使用这样的指针类:
void func(pointer<std::string> s);
由于func可能是虚拟的,因此无法实现:
template<memory_management_t MEM>
void func(pointer<std::string, MEM> s);
如果我可以在没有重载这些函数的情况下将指针传递给函数,那将是很好的,如果它们是pointer<T, memory_management_t::raw_pointer>
或pointer<T,memory_management_t::counted_pointer>
我怎样才能达到这个效率?
答案 0 :(得分:2)
拥有这样一个指针类的唯一原因是,如果您希望能够在运行时将拥有或未拥有的内存传递给函数/对象。在这种情况下,什么决定了你的&#34;通用指针的状态。 class不应该是模板。模板在编译时执行,而不是运行时。
你的班级应该是一个有区别的联盟:
template<class T>
class pointer
{
public:
T* get() const
{
if(is_raw)
{
return const_cast<T*>(ptr.p);
}
return ptr.sp.get();
}
private:
union ptr_union
{
T *p = nullptr;
shared_ptr<T> sp;
};
bool is_raw;
ptr_union ptr;
};
类本身跟踪它当前是哪种指针。您应该可以为其分配shared_ptr<T>
值,它将变为shared_ptr<T>
。如果您为其分配T*
,则会变为T*
。等等。
这样,您的预期func
就不再是模板了:
void func(pointer<std::string> s);
这是一个具体的课程。
顺便说一句:请注意,这类课程通常是个坏主意。存在智能指针以指定所有权。如果函数采用智能指针,则表示所有权的转移。如果某个函数没有采用智能指针,则代表缺少所有权转移。对于一个函数来取一个可能或可能不拥有的指针非常奇怪。在角落案件中,这并非完全无益。但这不是正常的事情,当然不应经常使用 。