#include <iostream>
#include <type_traits>
template <typename T, typename... Params>
struct TestTemplate
{
static constexpr size_t Sizeof()
{
return sizeof (typename std::remove_pointer<T>::type) + TestTemplate<Params...>::Sizeof();
}
};
template <typename T>
struct TestTemplate<T>
{
static constexpr size_t Sizeof()
{
return sizeof (typename std::remove_pointer<T>::type);
}
};
template <typename... Params>
constexpr size_t GetSizeof (const Params&...)
{
return TestTemplate<Params...>::Sizeof();
}
struct TestType
{
double x = 0., y = 0.;
char buf[64];
};
int main ()
{
// assumint that sizeof(int) == 4
static_assert(sizeof(int) == 4, "OP expect 32-bits int");
static_assert(TestTemplate<int[10]>::Sizeof() == 40, "unexpected Sizeof");
static_assert(GetSizeof (2, 3, 4) == 12, "unexpected Sizeof");
TestType tt;
static_assert(GetSizeof (&tt, 1) == 84, "unexpected Sizeof");
int int_arr[10];
static_assert(GetSizeof (int_arr, 1) == 44, "unexpected Sizeof");
const TestType* ctt = &tt;
static_assert(GetSizeof (ctt, 1) == 84, "unexpected Sizeof");
std::cout << TestTemplate<int[10]>::Sizeof() << std::endl; // prints 40. OK
std::cout << GetSizeof (2, 3, 4) << std::endl; // prints 12. OK
std::cout << GetSizeof (&tt, 1) << std::endl; // prints 84. OK
std::cout << GetSizeof (int_arr, 1) << std::endl; // prints 44 OK
std::cout << GetSizeof (ctt, 1) << std::endl; // prints 84. OK
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gIFBhcmFtcz4Kc3RydWN0IFRlc3RUZW1wbGF0ZQp7CiAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBTaXplb2YoKQogICAgewogICAgICAgIHJldHVybiBzaXplb2YgKHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8VD46OnR5cGUpICsgVGVzdFRlbXBsYXRlPFBhcmFtcy4uLj46OlNpemVvZigpOwogICAgfQp9OwoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgVGVzdFRlbXBsYXRlPFQ+CnsKICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IFNpemVvZigpCiAgICB7CiAgICAgICAgcmV0dXJuIHNpemVvZiAodHlwZW5hbWUgc3RkOjpyZW1vdmVfcG9pbnRlcjxUPjo6dHlwZSk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUGFyYW1zPgpjb25zdGV4cHIgc2l6ZV90IEdldFNpemVvZiAoY29uc3QgUGFyYW1zJi4uLikKewogICAgcmV0dXJuIFRlc3RUZW1wbGF0ZTxQYXJhbXMuLi4+OjpTaXplb2YoKTsKfQoKCnN0cnVjdCBUZXN0VHlwZQp7CiAgICBkb3VibGUgeCA9IDAuLCB5ID0gMC47CiAgICBjaGFyIGJ1Zls2NF07Cn07CgppbnQgbWFpbiAoKQp7CiAgICAvLyBhc3N1bWludCB0aGF0IHNpemVvZihpbnQpID09IDQKICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludCkgPT0gNCwgIk9QIGV4cGVjdCAzMi1iaXRzIGludCIpOwogICAgc3RhdGljX2Fzc2VydChUZXN0VGVtcGxhdGU8aW50WzEwXT46OlNpemVvZigpID09IDQwLCAidW5leHBlY3RlZCBTaXplb2YiKTsKICAgIHN0YXRpY19hc3NlcnQoR2V0U2l6ZW9mICgyLCAzLCA0KSA9PSAxMiwgInVuZXhwZWN0ZWQgU2l6ZW9mIik7CiAgICBUZXN0VHlwZSB0dDsKICAgIHN0YXRpY19hc3NlcnQoR2V0U2l6ZW9mICgmdHQsIDEpID09IDg0LCAidW5leHBlY3RlZCBTaXplb2YiKTsKICAgIGludCBpbnRfYXJyWzEwXTsKICAgIHN0YXRpY19hc3NlcnQoR2V0U2l6ZW9mIChpbnRfYXJyLCAxKSA9PSA0NCwgInVuZXhwZWN0ZWQgU2l6ZW9mIik7Cgljb25zdCBUZXN0VHlwZSogY3R0ID0gJnR0OwogICAgc3RhdGljX2Fzc2VydChHZXRTaXplb2YgKGN0dCwgMSkgPT0gODQsICJ1bmV4cGVjdGVkIFNpemVvZiIpOwoKICAgIHN0ZDo6Y291dCA8PCBUZXN0VGVtcGxhdGU8aW50WzEwXT46OlNpemVvZigpIDw8IHN0ZDo6ZW5kbDsgLy8gcHJpbnRzIDQwLiBPSwogICAgc3RkOjpjb3V0IDw8IEdldFNpemVvZiAoMiwgMywgNCkgPDwgc3RkOjplbmRsOyAvLyBwcmludHMgMTIuIE9LCiAgICBzdGQ6OmNvdXQgPDwgR2V0U2l6ZW9mICgmdHQsIDEpIDw8IHN0ZDo6ZW5kbDsgLy8gcHJpbnRzIDg0LiBPSwogICAgc3RkOjpjb3V0IDw8IEdldFNpemVvZiAoaW50X2FyciwgMSkgPDwgc3RkOjplbmRsOyAvLyBwcmludHMgNDQgT0sKICAgIHN0ZDo6Y291dCA8PCBHZXRTaXplb2YgKGN0dCwgMSkgPDwgc3RkOjplbmRsOyAvLyBwcmludHMgODQuIE9LCiAgICByZXR1cm4gMDsKfQo=