我正在尝试研究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指针强制转换回原始类型。
比较这两种方式有哪些优缺点?
谢谢!
答案 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
也是如此。