将通用指针类传递给函数

Passing universal pointer class to functions

本文关键字:函数 指针      更新时间:2023-10-16

我正在尝试实现一个通用指针类,它可以容纳八分之一的原始指针或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:注意,这样的类通常是个坏主意。存在用于指定所有权的智能指针。如果函数采用智能指针,则表示所有权的转移。如果函数不采用智能指针,则表示所有权转移不足

对于一个函数来说,获取一个可能或不属于的指针是非常。。。古怪的在极端情况下,这并非完全没有帮助。但这不是一件正常的事情,当然不应该经常使用