#include <string>
#include <iostream>
#define static_type(name) static constexpr const char* type_name() { return name; }
struct disabled { static_type("disabled"); };
struct deferred { static_type("deferred"); };
struct deadline { static_type("deadline"); };
template<typename Expected, typename...T>
struct match { typedef disabled type; };
template <typename Expected, typename...T>
struct match<Expected, Expected, T...> { typedef Expected type; };
template <typename Expected, typename Actual, typename...T>
struct match<Expected, Actual, T...> { typedef typename match<Expected, T...>::type type; };
template<class T, typename... Plugins>
struct container
{
typedef typename match<deferred, Plugins...>::type deferred_;
typedef typename match<deadline, Plugins...>::type deadline_;
static std::string type_name()
{
return std::string("container<") + deferred_::type_name() + ", " + deadline_::type_name() + ">";
}
};
int main()
{
using namespace std;
cout << container<int>::type_name() << std::endl;
cout << container<int, deadline>::type_name() << std::endl;
cout << container<int, deferred>::type_name() << std::endl;
cout << container<int, deferred, deadline>::type_name() << std::endl;
cout << container<int, deadline, deferred>::type_name() << std::endl;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKI2RlZmluZSBzdGF0aWNfdHlwZShuYW1lKSBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSgpIHsgcmV0dXJuIG5hbWU7IH0gCgpzdHJ1Y3QgZGlzYWJsZWQgeyBzdGF0aWNfdHlwZSgiZGlzYWJsZWQiKTsgfTsKc3RydWN0IGRlZmVycmVkIHsgc3RhdGljX3R5cGUoImRlZmVycmVkIik7IH07CnN0cnVjdCBkZWFkbGluZSB7IHN0YXRpY190eXBlKCJkZWFkbGluZSIpOyB9OwoKdGVtcGxhdGU8dHlwZW5hbWUgRXhwZWN0ZWQsIHR5cGVuYW1lLi4uVD4gCnN0cnVjdCBtYXRjaCB7IHR5cGVkZWYgZGlzYWJsZWQgdHlwZTsgfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBFeHBlY3RlZCwgdHlwZW5hbWUuLi5UPgpzdHJ1Y3QgbWF0Y2g8RXhwZWN0ZWQsIEV4cGVjdGVkLCBULi4uPiB7IHR5cGVkZWYgRXhwZWN0ZWQgdHlwZTsgfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBFeHBlY3RlZCwgdHlwZW5hbWUgQWN0dWFsLCB0eXBlbmFtZS4uLlQ+CnN0cnVjdCBtYXRjaDxFeHBlY3RlZCwgQWN0dWFsLCBULi4uPiB7IHR5cGVkZWYgdHlwZW5hbWUgbWF0Y2g8RXhwZWN0ZWQsIFQuLi4+Ojp0eXBlIHR5cGU7IH07CgoKdGVtcGxhdGU8Y2xhc3MgVCwgdHlwZW5hbWUuLi4gUGx1Z2lucz4Kc3RydWN0IGNvbnRhaW5lcgp7CiAgICB0eXBlZGVmIHR5cGVuYW1lIG1hdGNoPGRlZmVycmVkLCBQbHVnaW5zLi4uPjo6dHlwZSBkZWZlcnJlZF87CiAgICB0eXBlZGVmIHR5cGVuYW1lIG1hdGNoPGRlYWRsaW5lLCBQbHVnaW5zLi4uPjo6dHlwZSBkZWFkbGluZV87CiAgICAKICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0eXBlX25hbWUoKQogICAgewogICAgCXJldHVybiBzdGQ6OnN0cmluZygiY29udGFpbmVyPCIpICsgZGVmZXJyZWRfOjp0eXBlX25hbWUoKSArICIsICIgKyBkZWFkbGluZV86OnR5cGVfbmFtZSgpICsgIj4iOwogICAgfQp9OwoKaW50IG1haW4oKQp7Cgl1c2luZyBuYW1lc3BhY2Ugc3RkOwoJY291dCA8PCBjb250YWluZXI8aW50Pjo6dHlwZV9uYW1lKCkgPDwgc3RkOjplbmRsOwogICAJY291dCA8PCBjb250YWluZXI8aW50LCBkZWFkbGluZT46OnR5cGVfbmFtZSgpIDw8IHN0ZDo6ZW5kbDsKICAgCWNvdXQgPDwgY29udGFpbmVyPGludCwgZGVmZXJyZWQ+Ojp0eXBlX25hbWUoKSA8PCBzdGQ6OmVuZGw7CiAgIAljb3V0IDw8IGNvbnRhaW5lcjxpbnQsIGRlZmVycmVkLCBkZWFkbGluZT46OnR5cGVfbmFtZSgpIDw8IHN0ZDo6ZW5kbDsKICAgCWNvdXQgPDwgY29udGFpbmVyPGludCwgZGVhZGxpbmUsIGRlZmVycmVkPjo6dHlwZV9uYW1lKCkgPDwgc3RkOjplbmRsOwp9