#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 (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");
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
const TestType* ctt = &tt;
std::cout << GetSizeof (ctt, 1) << std::endl; // prints 8. Want 84.
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gIFBhcmFtcz4Kc3RydWN0IFRlc3RUZW1wbGF0ZQp7CiAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBTaXplb2YoKQogICAgewogICAgICAgIHJldHVybiBzaXplb2YgKHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8VD46OnR5cGUpICsgVGVzdFRlbXBsYXRlPFBhcmFtcy4uLj46OlNpemVvZigpOwogICAgfQp9OwoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgVGVzdFRlbXBsYXRlPFQ+CnsKICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IFNpemVvZigpCiAgICB7CiAgICAgICAgcmV0dXJuIHNpemVvZiAodHlwZW5hbWUgc3RkOjpyZW1vdmVfcG9pbnRlcjxUPjo6dHlwZSk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUGFyYW1zPgpjb25zdGV4cHIgc2l6ZV90IEdldFNpemVvZiAoUGFyYW1zJiYuLi4pCnsKICAgIHJldHVybiBUZXN0VGVtcGxhdGU8UGFyYW1zLi4uPjo6U2l6ZW9mKCk7Cn0KCgpzdHJ1Y3QgVGVzdFR5cGUKewogICAgZG91YmxlIHggPSAwLiwgeSA9IDAuOwogICAgY2hhciBidWZbNjRdOwp9OwoKaW50IG1haW4gKCkKewogICAgLy8gYXNzdW1pbnQgdGhhdCBzaXplb2YoaW50KSA9PSA0CiAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQpID09IDQsICJPUCBleHBlY3QgMzItYml0cyBpbnQiKTsKICAgIHN0YXRpY19hc3NlcnQoVGVzdFRlbXBsYXRlPGludFsxMF0+OjpTaXplb2YoKSA9PSA0MCwgInVuZXhwZWN0ZWQgU2l6ZW9mIik7CiAgICBzdGF0aWNfYXNzZXJ0KEdldFNpemVvZiAoMiwgMywgNCkgPT0gMTIsICJ1bmV4cGVjdGVkIFNpemVvZiIpOwogICAgVGVzdFR5cGUgdHQ7CiAgICBzdGF0aWNfYXNzZXJ0KEdldFNpemVvZiAoJnR0LCAxKSA9PSA4NCwgInVuZXhwZWN0ZWQgU2l6ZW9mIik7CiAgICBpbnQgaW50X2FyclsxMF07CiAgICBzdGF0aWNfYXNzZXJ0KEdldFNpemVvZiAoaW50X2FyciwgMSkgPT0gNDQsICJ1bmV4cGVjdGVkIFNpemVvZiIpOwoKICAgIHN0ZDo6Y291dCA8PCBUZXN0VGVtcGxhdGU8aW50WzEwXT46OlNpemVvZigpIDw8IHN0ZDo6ZW5kbDsgLy8gcHJpbnRzIDQwLiBPSwogICAgc3RkOjpjb3V0IDw8IEdldFNpemVvZiAoMiwgMywgNCkgPDwgc3RkOjplbmRsOyAvLyBwcmludHMgMTIuIE9LCiAgICBzdGQ6OmNvdXQgPDwgR2V0U2l6ZW9mICgmdHQsIDEpIDw8IHN0ZDo6ZW5kbDsgLy8gcHJpbnRzIDg0LiBPSwogICAgc3RkOjpjb3V0IDw8IEdldFNpemVvZiAoaW50X2FyciwgMSkgPDwgc3RkOjplbmRsOyAvLyBwcmludHMgNDQgT0sKICAgIAogICAgY29uc3QgVGVzdFR5cGUqIGN0dCA9ICZ0dDsKICAgIHN0ZDo6Y291dCA8PCBHZXRTaXplb2YgKGN0dCwgMSkgPDwgc3RkOjplbmRsOyAvLyBwcmludHMgOC4gV2FudCA4NC4KICAgIHJldHVybiAwOwp9Cg==