#include <memory>

template<typename T>
struct Helper
{
	template<template<typename...> class Wrapper = std::unique_ptr, typename... Args>
	static Wrapper<T, Args...> Wrap(T const &t)
	{
		return Wrapper<T, Args...>{new T{t}};
	}
};

template<typename T, template<typename...> typename Wrapper = std::unique_ptr, typename... Args>
struct WrapperHelper final
{
};

int main()
{
	int x = 0;
	auto c1 = Helper<int>::Wrap<>(x);
	auto c2 = Helper<int>::Wrap<std::shared_ptr>(x);
	auto c3 = Helper<int>::Wrap<WrapperHelper, int>(*c1);
}
