将通用指针类传递给函数
Passing universal pointer class to functions
我正在尝试实现一个通用指针类,它可以容纳八分之一的原始指针或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:注意,这样的类通常是个坏主意。存在用于指定所有权的智能指针。如果函数采用智能指针,则表示所有权的转移。如果函数不采用智能指针,则表示所有权转移不足。
对于一个函数来说,获取一个可能或不属于的指针是非常。。。古怪的在极端情况下,这并非完全没有帮助。但这不是一件正常的事情,当然不应该经常使用。
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针