【问题标题】:Passing universal pointer class to functions将通用指针类传递给函数
【发布时间】:2016-09-25 19:57:10
【问题描述】:

我正在尝试实现一个通用指针类,它包含一个原始指针或shared_ptr。我有一个枚举来指示指针对象包含什么。

enum class memory_management_t{
    raw_pointer,
    counted_pointer,
};

指针类是一个模板类:

template<class T, memory_management_t MEM>
class pointer;

这会重载 -&gt;* 运算符。 现在我的问题是一个类的虚成员函数是否想像这样使用指针类:

void func(pointer<std::string> s);

由于 func 可以是虚拟的,所以这是不可能的:

template<memory_management_t MEM>
void func(pointer<std::string, MEM> s);

如果我可以传递指向函数的指针而不重载这些函数,那就太好了,如果它们是 pointer&lt;T, memory_management_t::raw_pointer&gt;pointer&lt;T,memory_management_t::counted_pointer&gt; 就不行了

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

【问题讨论】:

  • “这一切仅用于教育目的,所以请不要建议我改变我的设计或说这样做在 c++ 中是个坏主意。”你期待吗??
  • 看看CRTP,可能会从这个方向提供解决方案。
  • @πάνταῥεῖ 对不起,我只是不想要“根本不这样做”这样的答案,因为如果有帮助,我会改变我的设计

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


【解决方案1】:

拥有这样一个指针类的唯一原因是如果您希望能够在运行时将拥有或无主内存传递给函数/对象。在这种情况下,决定“通用指针”类状态的不应该是模板。模板在编译时做事,而不是运行时。

你的班级应该是一个有区别的工会:

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&lt;T&gt; 值,它将变为shared_ptr&lt;T&gt;。如果你给它分配一个T*,它就会变成一个T*。以此类推。

这样,您预期的func 不再是模板:

void func(pointer<std::string> s);

这是一个具体的类。


顺便说一句:请注意,此类课程通常不是一个好主意。存在智能指针以指定所有权。如果函数采用智能指针,则表示所有权转移。如果函数不采用智能指针,则表示缺乏所有权转移。

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

【讨论】:

  • 如果我在编译时确定一个指针是引用计数的还是原始的。那么我可以用模板来做到这一点,不是吗?
  • @Exagon "如果我在编译时确定指针是引用计数的还是原始的,该怎么办。" 那么你应该使用类型 T*shared_ptr&lt;T&gt; 基于那个决心。如果不了解做出此决定的模板元编程代码,我无法解释更多。
猜你喜欢
  • 2018-02-06
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
相关资源
最近更新 更多