我想要做的是在我的库类中将可变大小的 POD 作为 Pimpl:
// 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 标准的 [可能是过时的草案] 副本并没有给我任何更好的线索。
如果有人能指出我的任何东西(最好是标准中的一个部分)可以证明这种方式或另一种方式(合法与否),我将永远感激不尽。