我正在尝试实现一个通用指针类,它可以容纳八分之一的原始指针或shared_ptr
。我有一个枚举来指示指针对象包含的内容。
enum class memory_management_t{
raw_pointer,
counted_pointer,
};
指针类是一个模板类:
template<class T, memory_management_t MEM>
class pointer;
这使CCD_ 2和CCD_。现在我的问题是,一个类的虚拟成员函数是否想使用这样的指针类:
void func(pointer<std::string> s);
由于函数可以是虚拟的,这是不可能的:
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>
,那就没有数学了
我如何才能做到这一点?
拥有这样一个指针类的唯一原因是,如果您希望能够在运行时将拥有或不拥有的内存传递给函数/对象。在这种情况下,决定"通用指针"类状态的不应该是模板。模板在编译时而不是运行时执行任务。
你的班级应该是一个有区别的联盟:
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);
这是一门具体的课。
BTW:注意,这样的类通常是个坏主意。存在用于指定所有权的智能指针。如果函数采用智能指针,则表示所有权的转移。如果函数不采用智能指针,则表示所有权转移不足。
对于一个函数来说,获取一个可能或不属于的指针是非常。。。古怪的在极端情况下,这并非完全没有帮助。但这不是一件正常的事情,当然不应该经常使用。