#include <array>
#include <iostream>
#include <string>
template <typename T>
struct size_getter {
static size_t getSize( T );
};
template <typename T>
void serialize(const T &data)
{
size_t data_size = size_getter<T>::getSize( data );
std::cout << "Size: " << data_size << std::endl;
}
template<>
struct size_getter<int> {
static constexpr size_t getSize( int )
{
return sizeof(int);
}
};
template<>
struct size_getter<std::string> {
static size_t getSize( const std::string &s )
{
return s.size();
}
};
template <typename T, size_t N>
struct size_getter<std::array<T, N>>
{
static size_t getSize(const std::array<T, N> &array)
{
size_t array_size = 0;
for (const T &element : array)
array_size += size_getter<T>::getSize(element);
return array_size;
}
};
int main()
{
int a;
serialize(a);
std::string str = "foo";
serialize(str);
std::array<std::string, 2> arr = {{"foo", "foobar"}};
serialize(arr);
return 0;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IHNpemVfZ2V0dGVyIHsKICAgIHN0YXRpYyBzaXplX3QgZ2V0U2l6ZSggVCApOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgc2VyaWFsaXplKGNvbnN0IFQgJmRhdGEpCnsKICAgIHNpemVfdCBkYXRhX3NpemUgPSBzaXplX2dldHRlcjxUPjo6Z2V0U2l6ZSggZGF0YSApOwogICAgc3RkOjpjb3V0IDw8ICJTaXplOiAiIDw8IGRhdGFfc2l6ZSA8PCBzdGQ6OmVuZGw7Cn0KCnRlbXBsYXRlPD4Kc3RydWN0IHNpemVfZ2V0dGVyPGludD4gewogICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgZ2V0U2l6ZSggaW50ICkKICAgIHsKICAgICAgICByZXR1cm4gc2l6ZW9mKGludCk7CiAgICB9Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBzaXplX2dldHRlcjxzdGQ6OnN0cmluZz4gewogICAgc3RhdGljIHNpemVfdCBnZXRTaXplKCBjb25zdCBzdGQ6OnN0cmluZyAmcyApCiAgICB7CiAgICAgICAgcmV0dXJuIHMuc2l6ZSgpOwogICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgpzdHJ1Y3Qgc2l6ZV9nZXR0ZXI8c3RkOjphcnJheTxULCBOPj4KewogICAgc3RhdGljIHNpemVfdCBnZXRTaXplKGNvbnN0IHN0ZDo6YXJyYXk8VCwgTj4gJmFycmF5KQogICAgewogICAgICAgIHNpemVfdCBhcnJheV9zaXplID0gMDsKICAgICAgICBmb3IgKGNvbnN0IFQgJmVsZW1lbnQgOiBhcnJheSkKICAgICAgICAgICAgYXJyYXlfc2l6ZSArPSBzaXplX2dldHRlcjxUPjo6Z2V0U2l6ZShlbGVtZW50KTsKICAgICAgICByZXR1cm4gYXJyYXlfc2l6ZTsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgaW50IGE7CiAgICBzZXJpYWxpemUoYSk7CgogICAgc3RkOjpzdHJpbmcgc3RyID0gImZvbyI7CiAgICBzZXJpYWxpemUoc3RyKTsKCiAgICBzdGQ6OmFycmF5PHN0ZDo6c3RyaW5nLCAyPiBhcnIgPSB7eyJmb28iLCAiZm9vYmFyIn19OwogICAgc2VyaWFsaXplKGFycik7CgogICAgcmV0dXJuIDA7Cn0=