実用上は元ネタのマクロで十分なのですが、この企画はあくまでも「C++関数・テンプレート集」ですので、ちょっと強引ながらもメタ関数と関数を作ってみることにします。
まずはメタ関数からです。
0 1 2 3 4 5 6 7 8 9 10 11 12 |
template <std::size_t Offset, std::size_t Alignment> struct align_offset { static const std::size_t value = (Offset + Alignment - 1) / Alignment * Alignment; }; template <std::size_t Offset, typename T> struct align_type { static const std::size_t value = align_offset<Offset, alignof(T)>::value; }; |
メタ関数を2つ定義してみました。前者はオフセット値Offsetが境界調整の要求サイズAlignmentの倍数になるように切り上げた値を返します。後者はオフセット値Offsetを型Tの境界調整要求サイズの倍数になるように切り上げます。
後者のalign_typeメタ関数ではalignofを使っていますが、C++03までを使う場合は前回の記事を参考に別の方法を使うようにしてください。
次に関数を作ってみます。今回は最初からconstexprを付けて定義してみることにしました。
0 1 2 3 4 5 6 7 8 9 10 11 |
constexpr std::size_t align_offset(std::size_t offset, std::size_t alignment) { return (offset + alignment - 1) / alignment * alignment; } template <typename T> constexpr std::size_t align_type(std::size_t offset) { return align_offset(offset, alignof(T)); } |
constexprを付けずに単なるインライン関数にすればC++03まででも使えますが、それなら元ネタのマクロでも十分だと思います。