#include <iostream>
template <unsigned N>
class element {
public:
const static unsigned value = N;
};
template <typename ...Elems>
class set {
};
template <typename T, typename U>
class join;
template <typename ...Elems>
class join<set<>, set<Elems...>> {
public:
typedef set<Elems...> type;
};
template <typename Elem1, typename ...Elems, typename ...Elems2>
class join<set<Elem1, Elems...>, set<Elems2...>> {
public:
typedef typename join<set<Elems...>, set<Elem1, Elems2...>>::type type;
};
template <typename T, typename U>
class all_subsets_worker;
template <typename Rest>
class all_subsets_worker<set<>, Rest>
{
public:
typedef set<Rest> type;
};
template <typename Elem, typename Rest, typename ...Elems>
class all_subsets_worker<set<Elem, Elems...>, Rest>
{
public:
typedef typename join<
typename all_subsets_worker<set<Elems...>, Rest>::type,
typename all_subsets_worker<set<Elems...>, typename join< set<Elem>, Rest>::type >::type
>::type type;
};
template <typename T>
class all_subsets;
template <typename Elem, typename ...Elems>
class all_subsets<set<Elem, Elems...>> {
public:
typedef typename all_subsets_worker<set<Elem, Elems...>, set<>>::type type;
};
int main(int argc, const char * argv[])
{
auto t = all_subsets<set<element<0>, element<1>, element<2>, element<3>>>::type();
double u = t;
// insert code here...
std::cout << "Hello, World!\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHVuc2lnbmVkIE4+CmNsYXNzIGVsZW1lbnQgewpwdWJsaWM6CiAgICBjb25zdCBzdGF0aWMgdW5zaWduZWQgdmFsdWUgPSBOOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIC4uLkVsZW1zPgpjbGFzcyBzZXQgewp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CmNsYXNzIGpvaW47Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgLi4uRWxlbXM+CmNsYXNzIGpvaW48c2V0PD4sIHNldDxFbGVtcy4uLj4+IHsKcHVibGljOgogICAgdHlwZWRlZiBzZXQ8RWxlbXMuLi4+IHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbTEsIHR5cGVuYW1lIC4uLkVsZW1zLCB0eXBlbmFtZSAuLi5FbGVtczI+CmNsYXNzIGpvaW48c2V0PEVsZW0xLCBFbGVtcy4uLj4sIHNldDxFbGVtczIuLi4+PiB7CnB1YmxpYzoKICAgIHR5cGVkZWYgdHlwZW5hbWUgam9pbjxzZXQ8RWxlbXMuLi4+LCBzZXQ8RWxlbTEsIEVsZW1zMi4uLj4+Ojp0eXBlIHR5cGU7Cn07CgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CmNsYXNzIGFsbF9zdWJzZXRzX3dvcmtlcjsKCnRlbXBsYXRlIDx0eXBlbmFtZSBSZXN0PgpjbGFzcyBhbGxfc3Vic2V0c193b3JrZXI8c2V0PD4sIFJlc3Q+CnsKcHVibGljOgogICAgdHlwZWRlZiBzZXQ8UmVzdD4gdHlwZTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtLCB0eXBlbmFtZSBSZXN0LCB0eXBlbmFtZSAuLi5FbGVtcz4KY2xhc3MgYWxsX3N1YnNldHNfd29ya2VyPHNldDxFbGVtLCBFbGVtcy4uLj4sIFJlc3Q+CnsKcHVibGljOgogICAgdHlwZWRlZiB0eXBlbmFtZSBqb2luPAogICAgICAgICAgICAgICAgdHlwZW5hbWUgYWxsX3N1YnNldHNfd29ya2VyPHNldDxFbGVtcy4uLj4sIFJlc3Q+Ojp0eXBlLAogICAgICAgICAgICAgICAgdHlwZW5hbWUgYWxsX3N1YnNldHNfd29ya2VyPHNldDxFbGVtcy4uLj4sIHR5cGVuYW1lIGpvaW48IHNldDxFbGVtPiwgUmVzdD46OnR5cGUgPjo6dHlwZQogICAgICAgICAgICA+Ojp0eXBlIHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgYWxsX3N1YnNldHM7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbSwgdHlwZW5hbWUgLi4uRWxlbXM+CmNsYXNzIGFsbF9zdWJzZXRzPHNldDxFbGVtLCBFbGVtcy4uLj4+IHsKcHVibGljOgogICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxfc3Vic2V0c193b3JrZXI8c2V0PEVsZW0sIEVsZW1zLi4uPiwgc2V0PD4+Ojp0eXBlIHR5cGU7Cn07CgppbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqIGFyZ3ZbXSkKewogICAgYXV0byB0ID0gYWxsX3N1YnNldHM8c2V0PGVsZW1lbnQ8MD4sIGVsZW1lbnQ8MT4sIGVsZW1lbnQ8Mj4sIGVsZW1lbnQ8Mz4+Pjo6dHlwZSgpOwoKICAgIGRvdWJsZSB1ID0gdDsKCiAgICAvLyBpbnNlcnQgY29kZSBoZXJlLi4uCiAgICBzdGQ6OmNvdXQgPDwgIkhlbGxvLCBXb3JsZCFcbiI7CiAgICByZXR1cm4gMDsKfQo=
prog.cpp: In function 'int main(int, const char**)':
prog.cpp:62:16: error: cannot convert 'set<set<element<3u>, element<2u>, element<1u> >, set<element<2u>, element<1u> >, set<element<1u> >, set<element<3u>, element<1u> >, set<element<3u> >, set<>, set<element<2u> >, set<element<3u>, element<2u> >, set<element<3u>, element<2u>, element<0u> >, set<element<2u>, element<0u> >, set<element<0u> >, set<element<3u>, element<0u> >, set<element<3u>, element<1u>, element<0u> >, set<element<1u>, element<0u> >, set<element<2u>, element<1u>, element<0u> >, set<element<3u>, element<2u>, element<1u>, element<0u> > >' to 'double' in initialization