在C ++ pimpl中使用void指针的优点和缺点

时间:2016-02-12 03:50:15

标签: c++ pimpl-idiom

我正在尝试研究C ++的pimpl技术。在网上浏览了一些文章之后,我发现pimpl有两种不同的方式,一种是

class X
{
  public:
    X(...parameters...)
    ~X()
  private:
    struct Impl;
    Impl* impl_;
};

另一种方法是使用原始void指针,如

class X
{
  public:
    X(...parameters...)
    ~X()
  private:
    void * impl_;
};

然后使用static_cast将void指针强制转换回原始类型。

比较这两种方式有哪些优缺点?

谢谢!

2 个答案:

答案 0 :(得分:6)

不要使用static_cast来实施pimpl,也不要使用大部分内容。它没有任何好处;并且存在潜在的问题,如果由于某种原因你void*错误的类型,你将有未定义的行为。

正如您在第一个示例中所做的那样,向前声明您的实现类很容易。这是实现pimpl的正确方法。

答案 1 :(得分:1)

使用第一个,使用调试器,您将能够查看impl指针及其数据成员值。如果你有一个Impl* GetImpl() { return impl_; } 指针,你将无法做到这一点。第二种选择并没有提供我所知道的任何优势。

无论哪种方式,如果你有

Impl* GetImpl() { return static_cast<Impl*>(impl_); }

struct Impl* impl_;

这两个函数将生成完全相同的汇编代码。

如果你不需要吸气剂,你可以改为: /<p>\s*<!\[CDATA\[(?:<!--)?([\S\s]*?)(?:-->)?\]\]>\s*<\/p>/gi 也是如此。