gpt4 book ai didi

c++ - 替代 PImpl Idiom - 优势与劣势?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:13 29 4
gpt4 key购买 nike

传统的PImpl Idiom是这样的:

#include <memory>

struct Blah
{
//public interface declarations

private:
struct Impl;
std::unique_ptr<Impl> impl;
};

//in source implementation file:

struct Blah::Impl
{
//private data
};
//public interface definitions

然而,for fun, I tried改为使用具有私有(private)继承的组合:

[测试.h]

#include <type_traits>
#include <memory>

template<typename Derived>
struct PImplMagic
{
PImplMagic()
{
static_assert(std::is_base_of<PImplMagic, Derived>::value,
"Template parameter must be deriving class");
}
//protected: //has to be public, unfortunately
struct Impl;
};

struct Test : private PImplMagic<Test>,
private std::unique_ptr<PImplMagic<Test>::Impl>
{
Test();
~Test();
void f();
};

[第一个翻译单元]

#include "Test.h"
int main()
{
Test t;
t.f();
}

[第二翻译单元]

#include <iostream>
#include <memory>

#include "Test.h"

template<>
struct PImplMagic<Test>::Impl
{
Impl()
{
std::cout << "It works!" << std::endl;
}
int x = 7;
};

Test::Test()
: std::unique_ptr<Impl>(new Impl)
{
}

Test::~Test() // required for `std::unique_ptr`'s dtor
{}

void Test::f()
{
std::cout << (*this)->x << std::endl;
}

http://ideone.com/WcxJu2

我喜欢这个替代版本的工作方式,但我很好奇它是否比传统版本有任何重大缺点?

编辑:DyP 还提供了 another version ,这甚至更“漂亮”。

最佳答案

据我所知,使用 pimpl 习惯用法的原因之一是向界面用户隐藏功能细节。在您使用私有(private)继承示例的组合中,我相信您正在向用户公开您的实现细节。

关于c++ - 替代 PImpl Idiom - 优势与劣势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19125181/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com