#include <cstdio>
#include <memory>
template <typename T>
struct allocator{
template<typename... Args>
auto operator()(Args&&... args) const {
return std::make_unique<T>(std::forward<Args>(args)...);
}
};
template <typename T, typename A = allocator<T>>
auto get(A a=A{}) {
return [a](auto... args){
return a(args...);
};
};
int main() {
auto up0 = get<int>()();
auto up1 = get<int>()(1);
auto up0b = get<int>(allocator<int>())();
auto up1b = get<int>(allocator<int>())(1);
auto up0c = get<int>([](auto ... args){ return std::make_unique<int>(args...); })();
auto up1c = get<int>([](auto ... args){ return std::make_unique<int>(args...); })(1);
printf("%d\n", *up0);
printf("%d\n", *up0b);
printf("%d\n", *up0c);
printf("%d\n", *up1);
printf("%d\n", *up1b);
printf("%d\n", *up1c);
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPG1lbW9yeT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgYWxsb2NhdG9yewogICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KICAgIGF1dG8gb3BlcmF0b3IoKShBcmdzJiYuLi4gYXJncykgY29uc3QgeyAKCSAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxUPihzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwogICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEEgPSBhbGxvY2F0b3I8VD4+CmF1dG8gZ2V0KEEgYT1Be30pIHsKCXJldHVybiBbYV0oYXV0by4uLiBhcmdzKXsgCgkJcmV0dXJuIGEoYXJncy4uLik7IAoJfTsKfTsKCgppbnQgbWFpbigpIHsKICBhdXRvIHVwMCA9IGdldDxpbnQ+KCkoKTsgCiAgYXV0byB1cDEgPSBnZXQ8aW50PigpKDEpOyAKICBhdXRvIHVwMGIgPSBnZXQ8aW50PihhbGxvY2F0b3I8aW50PigpKSgpOwogIGF1dG8gdXAxYiA9IGdldDxpbnQ+KGFsbG9jYXRvcjxpbnQ+KCkpKDEpOwogIGF1dG8gdXAwYyA9IGdldDxpbnQ+KFtdKGF1dG8gLi4uIGFyZ3MpeyByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxpbnQ+KGFyZ3MuLi4pOyB9KSgpOwogIGF1dG8gdXAxYyA9IGdldDxpbnQ+KFtdKGF1dG8gLi4uIGFyZ3MpeyByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxpbnQ+KGFyZ3MuLi4pOyB9KSgxKTsKCiAgcHJpbnRmKCIlZFxuIiwgKnVwMCk7CiAgcHJpbnRmKCIlZFxuIiwgKnVwMGIpOwogIHByaW50ZigiJWRcbiIsICp1cDBjKTsKICBwcmludGYoIiVkXG4iLCAqdXAxKTsKICBwcmludGYoIiVkXG4iLCAqdXAxYik7CiAgcHJpbnRmKCIlZFxuIiwgKnVwMWMpOwp9