#include <iostream>
#include <vector>
using namespace std;
template <typename T>
struct Get;
template <typename T>
struct Data {
std::vector<T> data;
};
template <typename T>
struct Get< Data<T> >
{
Data<T> operator()() {
return Data<T>{ {T{}, T{}} };
};
};
template <typename T>
struct Get< std::vector<T> >
{
std::vector<T> operator()() {
return std::vector<T>(3);
};
};
int main() {
std::cout << Get< Data<int> >()().data.size() << std::endl; // expected output is 2
std::cout << Get< std::vector<int> >()().size() << std::endl; // expected output is 3
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgR2V0OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBEYXRhIHsKICAgIHN0ZDo6dmVjdG9yPFQ+IGRhdGE7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IEdldDwgRGF0YTxUPiA+CnsKCURhdGE8VD4gb3BlcmF0b3IoKSgpIHsKCQlyZXR1cm4gRGF0YTxUPnsge1R7fSwgVHt9fSB9OwoJfTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgR2V0PCBzdGQ6OnZlY3RvcjxUPiA+CnsKCXN0ZDo6dmVjdG9yPFQ+IG9wZXJhdG9yKCkoKSB7CgkJcmV0dXJuIHN0ZDo6dmVjdG9yPFQ+KDMpOwoJfTsKfTsKCmludCBtYWluKCkgewogICAgc3RkOjpjb3V0IDw8IEdldDwgRGF0YTxpbnQ+ID4oKSgpLmRhdGEuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsgIC8vIGV4cGVjdGVkIG91dHB1dCBpcyAyCiAgICBzdGQ6OmNvdXQgPDwgR2V0PCBzdGQ6OnZlY3RvcjxpbnQ+ID4oKSgpLnNpemUoKSA8PCBzdGQ6OmVuZGw7IC8vIGV4cGVjdGVkIG91dHB1dCBpcyAzCiAgICByZXR1cm4gMDsKfQ==