#include <iostream>
template <typename ResultInt>
class CalcFor
{
public:
CalcFor() : total_(0) { }
template <typename T>
void next()
{
total_ += sizeof(T);
}
ResultInt total() const { return total_; }
private:
ResultInt total_;
};
template <typename ResultInt, typename... Ts>
class Calc
{
public:
ResultInt total() const
{
CalcFor<ResultInt> e;
int dummy[] = { (e.template next<Ts>(), 0)... };
(void)dummy;
return e.total();
}
};
int main(const int /* argc */, const char* const* /* argv */ )
{
Calc<size_t, int, char> c;
std::cout << c.total() << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdEludD4KY2xhc3MgQ2FsY0Zvcgp7CnB1YmxpYzoKICAgIENhbGNGb3IoKSA6IHRvdGFsXygwKSB7IH0KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIHZvaWQgbmV4dCgpIAogICAgewogICAgICAgIHRvdGFsXyArPSBzaXplb2YoVCk7CiAgICB9CgogICAgUmVzdWx0SW50IHRvdGFsKCkgY29uc3QgeyByZXR1cm4gdG90YWxfOyB9Cgpwcml2YXRlOgogICAgUmVzdWx0SW50IHRvdGFsXzsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRJbnQsIHR5cGVuYW1lLi4uIFRzPgpjbGFzcyBDYWxjCnsKcHVibGljOgogICAgUmVzdWx0SW50IHRvdGFsKCkgY29uc3QKICAgIHsKICAgICAgICBDYWxjRm9yPFJlc3VsdEludD4gZTsKICAgICAgICBpbnQgZHVtbXlbXSA9IHsgKGUudGVtcGxhdGUgbmV4dDxUcz4oKSwgMCkuLi4gfTsKICAgICAgICAodm9pZClkdW1teTsKICAgICAgICByZXR1cm4gZS50b3RhbCgpOwogICAgfQp9OwoKaW50IG1haW4oY29uc3QgaW50IC8qIGFyZ2MgKi8sIGNvbnN0IGNoYXIqIGNvbnN0KiAvKiBhcmd2ICovICkKewogICAgQ2FsYzxzaXplX3QsIGludCwgY2hhcj4gYzsKICAgIHN0ZDo6Y291dCA8PCBjLnRvdGFsKCkgPDwgJ1xuJzsKICAgIHJldHVybiAwOwp9Cg==