#include <tuple>
#include <memory>
template<typename Type>
struct identity {
using type = Type;
};
template<typename...>
struct holder {};
template<typename ...Types>
struct holder<std::tuple<identity<Types>...>> {
};
struct abstract {
virtual ~abstract() = 0;
};
abstract::~abstract() {}
int main() {
using types = std::tuple<identity<abstract>>;
using holder_t = holder<types>;
// Ok
holder_t local;
// Ok
new holder_t;
// ?
std::unique_ptr<holder_t> unique(new holder_t);
// ?
std::make_shared<holder_t>();
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8bWVtb3J5PgogCiAKdGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4Kc3RydWN0IGlkZW50aXR5IHsKCiAgIHVzaW5nIHR5cGUgPSBUeXBlOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUuLi4+CnN0cnVjdCBob2xkZXIge307Cgp0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5UeXBlcz4Kc3RydWN0IGhvbGRlcjxzdGQ6OnR1cGxlPGlkZW50aXR5PFR5cGVzPi4uLj4+IHsKfTsKCiAKc3RydWN0IGFic3RyYWN0IHsKIAogICB2aXJ0dWFsIH5hYnN0cmFjdCgpID0gMDsKfTsKIAphYnN0cmFjdDo6fmFic3RyYWN0KCkge30KIAogCmludCBtYWluKCkgewogICB1c2luZyB0eXBlcyAgICAgPSBzdGQ6OnR1cGxlPGlkZW50aXR5PGFic3RyYWN0Pj47CiAgIHVzaW5nIGhvbGRlcl90ICA9IGhvbGRlcjx0eXBlcz47CiAKICAgLy8gT2sKICAgaG9sZGVyX3QgbG9jYWw7CiAKICAgLy8gT2sKICAgbmV3IGhvbGRlcl90OwogCiAgIC8vID8KICAgc3RkOjp1bmlxdWVfcHRyPGhvbGRlcl90PiB1bmlxdWUobmV3IGhvbGRlcl90KTsKIAogICAvLyA/CiAgIHN0ZDo6bWFrZV9zaGFyZWQ8aG9sZGVyX3Q+KCk7Cn0KIA==