将通用指针类传递给函数

时间:2016-05-27 12:55:21

标签: c++ templates pointers c++11 smart-pointers

我正在尝试实现一个通用指针类,它将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>

则不会

我怎样才能达到这个效率?

1 个答案:

答案 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);

这是一个具体的课程。

顺便说一句:请注意,这类课程通常是个坏主意。存在智能指针以指定所有权。如果函数采用智能指针,则表示所有权的转移。如果某个函数没有采用智能指针,则代表缺少所有权转移。

对于一个函数来取一个可能或可能不拥有的指针非常奇怪。在角落案件中,这并非完全无益。但这不是正常的事情,当然不应经常使用