Skip to content

Instantly share code, notes, and snippets.

@vmrob
Created January 26, 2015 19:08
Show Gist options
  • Save vmrob/76c15c2025ed17006797 to your computer and use it in GitHub Desktop.
Save vmrob/76c15c2025ed17006797 to your computer and use it in GitHub Desktop.
Arbitrary byte padding with C++ TMP
#include <type_traits>
template <typename T, size_t Amount, typename = void>
struct PaddedValImpl {
PaddedValImpl(T&& t) : val(std::forward<T>(t)) {}
T val;
};
template <typename T, size_t Amount>
struct PaddedValImpl <T, Amount
, typename std::enable_if<Amount != 0>::type>
{
PaddedValImpl(T&& t) : val(std::forward<T>(t)) {}
T val;
char padding[Amount] = {};
};
template <typename T, size_t PaddedTo>
struct PaddedVal : public PaddedValImpl<T, 63 - ((sizeof(T) - 1) % 64)> {
operator T&() {
return this->val;
};
};
template <typename T> using Pad64 = PaddedVal<T, 64>;
#include <iostream>
int main() {
std::cout << "sizeof(Pad64<char[0]>) == " << sizeof(Pad64<char[0]>) << std::endl;
std::cout << "sizeof(Pad64<char[1]>) == " << sizeof(Pad64<char[1]>) << std::endl;
std::cout << "sizeof(Pad64<char[31]>) == " << sizeof(Pad64<char[30]>) << std::endl;
std::cout << "sizeof(Pad64<char[63]>) == " << sizeof(Pad64<char[63]>) << std::endl;
std::cout << "sizeof(Pad64<char[64]>) == " << sizeof(Pad64<char[64]>) << std::endl;
std::cout << "sizeof(Pad64<char[65]>) == " << sizeof(Pad64<char[65]>) << std::endl;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment