Знаешь, я думал об этом и о твоем возражении против PIMPL.
У меня ужасный хак, который я иногда использую в таких случаях, когда я возмущаюсь, платя штраф за косвенное обращение. Хотя обычно моя жалоба связана с вызовом нового, а не с разыменованием указателя. Я представляю свой уродливый взлом таким образом:
// IHaveOpaqueData.h
class IHaveOpaqueData {
public:
// To make sure there are no alignment problems, maybe ::std::uin64_t
typedef maximally_aligned_type_t internal_data_t[32]; // Some size I hope is big enough
void iCanHazMemberFunction();
// ...
private:
internal_data_t data;
};
// IHaveOpaqueData.cpp
#include <boost/static_assert.hpp>
namespace { // Hide it in an anonymous namespace
struct RealData {
int icanhazmembervariable_;
double icanhazdoublevariable_;
};
BOOST_STATIC_ASSERT(sizeof(RealData) < sizeof(IHaveOpaqueData::internal_data_t);
}
void IHaveOpaqueData::iCanHazMemberFunction()
{
// Use a reference to help the optimize make the right decision
RealData &datathis = *(reinterpret_cast<RealData *>(&(this->data)));
datathis.icanhazmembervariable_ = datathis.icanhazdoublevariable_;
}
Да, это безобразно. BOOST_STATIC_ASSERT (или, если у вас есть компилятор C ++ [01] x, ключевое слово static_assert) помогает сделать это не полной катастрофой. Может быть разумный способ использовать профсоюзы для смягчения некоторых проблем, связанных с выравниванием, которые у меня есть.