#include <iostream>
#include <tuple>
#include <type_traits>
struct non_pod {
non_pod() {}
std::size_t size() const {
return 100;
}
private:
int x;
};
/* sizeof POD type */
template<std::size_t I = 0, typename... Tp>
typename std::enable_if<std::is_pod<typename std::tuple_element<I, std::tuple<Tp...>>::type>::value, int>::type
calculate_size(std::tuple<Tp...>&) {
return sizeof(typename std::tuple_element<I, std::tuple<Tp...>>::type);
}
/* sizeof non-pod type, require to implement size method */
template<std::size_t I = 0, typename... Tp>
typename std::enable_if<!std::is_pod<typename std::tuple_element<I, std::tuple<Tp...>>::type>::value, int>::type
calculate_size(std::tuple<Tp...>& t) {
return std::get<I>(t).size();
}
template<std::size_t I = 0, typename... Tp>
typename std::enable_if<I == sizeof...(Tp), int>::type
elements_size(std::tuple<Tp...>&) { return 0; }
template<std::size_t I = 0, typename... Tp>
typename std::enable_if<I < sizeof...(Tp), int>::type
elements_size(std::tuple<Tp...>& t) {
return calculate_size<I>(t) + elements_size<I + 1, Tp...>(t);
}
int main()
{
std::tuple<int, int, char, non_pod> t;
std::cout << elements_size(t) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnN0cnVjdCBub25fcG9kIHsKICAgIG5vbl9wb2QoKSB7fQoKICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIDEwMDsKICAgIH0KCnByaXZhdGU6CiAgICBpbnQgeDsKfTsKCi8qIHNpemVvZiBQT0QgdHlwZSAqLwp0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBJID0gMCwgdHlwZW5hbWUuLi4gVHA+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfcG9kPHR5cGVuYW1lIHN0ZDo6dHVwbGVfZWxlbWVudDxJLCBzdGQ6OnR1cGxlPFRwLi4uPj46OnR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZQpjYWxjdWxhdGVfc2l6ZShzdGQ6OnR1cGxlPFRwLi4uPiYpIHsKICAgIHJldHVybiBzaXplb2YodHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PEksIHN0ZDo6dHVwbGU8VHAuLi4+Pjo6dHlwZSk7Cn0KCi8qIHNpemVvZiBub24tcG9kIHR5cGUsIHJlcXVpcmUgdG8gaW1wbGVtZW50IHNpemUgbWV0aG9kICovCnRlbXBsYXRlPHN0ZDo6c2l6ZV90IEkgPSAwLCB0eXBlbmFtZS4uLiBUcD4KdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfcG9kPHR5cGVuYW1lIHN0ZDo6dHVwbGVfZWxlbWVudDxJLCBzdGQ6OnR1cGxlPFRwLi4uPj46OnR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZQpjYWxjdWxhdGVfc2l6ZShzdGQ6OnR1cGxlPFRwLi4uPiYgdCkgewogICAgcmV0dXJuIHN0ZDo6Z2V0PEk+KHQpLnNpemUoKTsKfQoKdGVtcGxhdGU8c3RkOjpzaXplX3QgSSA9IDAsIHR5cGVuYW1lLi4uIFRwPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxJID09IHNpemVvZi4uLihUcCksIGludD46OnR5cGUKZWxlbWVudHNfc2l6ZShzdGQ6OnR1cGxlPFRwLi4uPiYpIHsgcmV0dXJuIDA7IH0KCnRlbXBsYXRlPHN0ZDo6c2l6ZV90IEkgPSAwLCB0eXBlbmFtZS4uLiBUcD4KdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8SSA8IHNpemVvZi4uLihUcCksIGludD46OnR5cGUKZWxlbWVudHNfc2l6ZShzdGQ6OnR1cGxlPFRwLi4uPiYgdCkgewogICAgcmV0dXJuIGNhbGN1bGF0ZV9zaXplPEk+KHQpICsgZWxlbWVudHNfc2l6ZTxJICsgMSwgVHAuLi4+KHQpOwp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6dHVwbGU8aW50LCBpbnQsIGNoYXIsIG5vbl9wb2Q+IHQ7CiAgICBzdGQ6OmNvdXQgPDwgZWxlbWVudHNfc2l6ZSh0KSA8PCBzdGQ6OmVuZGw7CgogICAgcmV0dXJuIDA7Cn0K