その他の問題(コピーコンストラクターなど)は別として、すべてのクライアントにヘッダーをimpl::data
課さずにアクセスしたい場合は、次のようなことを行うことができます。<string>
// Foo.h
class FooUtil;
class Foo
{
friend class FooUtil;
private :
struct impl ;
impl * pimpl ;
};
// FooUtil.h
#include <string>
class FooUtil
{
public:
static std::string data_of(const Foo&);
};
// Foo.cpp
struct impl { std::string data; }
std::string FooUtil::data_of(const Foo& foo)
{
return foo.impl->data;
}
//main.cpp
Foo A;
Foo B;
std::string Foo::data() const
これは、メンバー関数を持つためのハックっぽい回避策です。アイデアは、<string>
ヘッダーを必要とするクライアントだけがヘッダーを含めることができるということです。
免責事項:私はこのアプローチが本当に好きではありません。非常にエレガントではなく、コンパイル時間が実際に長くなる可能性はほとんどありません。一部のコンパイラは、この種の混乱を回避できるように、標準ライブラリヘッダーをキャッシュ(またはプリコンパイル)します。