私がやろうとしているのは、ライブラリクラスのPimplとして可変サイズのPODを使用することです。
// header file
class foo {
public:
// ctors, copy, move, dtor, etc.
private:
struct impl; // forward-declared
impl* pimpl; // pointer to private implementation
};
次に、次のようないくつかの固定サイズの実装を定義します。
// .cpp implementation file
struct foo::impl {
uint32_t refs;
uint32_t size;
uint32_t len;
uint32_t data;
};
static_assert( sizeof( typename foo::impl ) == 16, "paranoia" );
namespace { // anonymous
typedef typename foo::impl base;
template <size_t S>
struct block : base {
static_assert( S > 16, "invalid block size" );
static_assert((( S - 1 ) & S ) == 0, "block size must be power of 2" );
uint8_t pad[S - 16];
};
typedef block<64> block64;
typedef block<128> block128;
// ...
}
// foo implementation using the above PODs
GCCバージョン4.6および4.7は、これを-std=c++0x -Wall -pedantic
でコンパイルするのに問題はありませんが、そのようなプライベートネストされた型名を使用することの合法性についてはまだあいまいです。私の[おそらく時代遅れのドラフト]C++ 11標準のコピーをくぐり抜けても、それ以上の手がかりは得られませんでした。
誰かが私にこれを何らかの方法で(合法であるかどうかにかかわらず)証明する何か(できれば標準のセクション)を指摘することができれば、私は永遠に感謝するでしょう。