// vi:ft=cpp #pragma once #include #include namespace cxx { template< typename T > class Static_container { public: void operator = (Static_container const &) = delete; Static_container(Static_container const &) = delete; Static_container() = default; T *get() { return reinterpret_cast(_s); } T *operator -> () { return get(); } T &operator * () { return *get(); } operator T* () { return get(); } void construct() { new (reinterpret_cast(_s)) T; } template< typename ...Args > void construct(Args... args) { new (reinterpret_cast(_s)) T(cxx::forward(args)...); } private: char _s[sizeof(T)] __attribute__((aligned(__alignof(T)))); }; }