Я хочу применить идиому Pimpl с идиомой локального хранилища:
mytype.h
class mytype {
struct Impl;
enum{ storage = 20; }
char m_storage[ storage ];
Impl* PImpl() { return (Impl*)m_storage; }
public:
mytype();
~mytype();
void myMethod();
};
mytype.cpp
#include "mytype.h"
struct mytype::Impl {
int foo;
void doMethod() { foo = (foo-1)*3; };
}
mytype::mytype() {
new (PImpl()) Impl(); // placement new
//check this at compile-time
static_assert( sizeof(Impl) == mytype::storage );
//assert alignment?
}
mytype::~mytype() {
PImpl()->~();
}
void mytype::myMethod() {
PImpl()->doMethod();
}
Единственное, что меня беспокоит при таком подходе, это выравнивание m_storage
. char
не гарантируется выравнивание так же, как должно быть int. Атомика может иметь еще более строгие требования к выравниванию. Я ищу что-то лучше, чем массив char для объявления хранилища, которое дает мне возможность также определять (и утверждать) значения выравнивания. Вы знаете что-нибудь подобное? может быть, библиотека повышения уже делает это?