fork(1) download
  1. #include <iostream>
  2. #include <string>
  3. #include <memory>
  4.  
  5.  
  6.  
  7. #include <cstddef>
  8. #include <memory>
  9. #include <type_traits>
  10. #include <utility>
  11.  
  12. namespace future{
  13. using namespace std;
  14. template<class T> struct _Never_true : false_type { };
  15.  
  16. template<class T> struct _Unique_if {
  17. typedef unique_ptr<T> _Single;
  18. };
  19.  
  20. template<class T> struct _Unique_if<T[]> {
  21. typedef unique_ptr<T[]> _Runtime;
  22. };
  23.  
  24. template<class T, size_t N> struct _Unique_if<T[N]> {
  25. static_assert(_Never_true<T>::value, "make_unique forbids T[N]. Please use T[].");
  26. };
  27.  
  28. template<class T, class... Args> typename _Unique_if<T>::_Single make_unique(Args&&... args) {
  29. return unique_ptr<T>(new T(std::forward<Args>(args)...));
  30. }
  31.  
  32. template<class T> typename _Unique_if<T>::_Single make_unique_default_init() {
  33. return unique_ptr<T>(new T);
  34. }
  35.  
  36. template<class T> typename _Unique_if<T>::_Runtime make_unique(size_t n) {
  37. typedef typename remove_extent<T>::type U;
  38. return unique_ptr<T>(new U[n]());
  39. }
  40.  
  41. template<class T> typename _Unique_if<T>::_Runtime make_unique_default_init(size_t n) {
  42. typedef typename remove_extent<T>::type U;
  43. return unique_ptr<T>(new U[n]);
  44. }
  45.  
  46. template<class T, class... Args> typename _Unique_if<T>::_Runtime make_unique_value_init(size_t n, Args&&... args) {
  47. typedef typename remove_extent<T>::type U;
  48. return unique_ptr<T>(new U[n]{ std::forward<Args>(args)... });
  49. }
  50.  
  51. template<class T, class... Args> typename _Unique_if<T>::_Runtime make_unique_auto_size(Args&&... args) {
  52. typedef typename remove_extent<T>::type U;
  53. return unique_ptr<T>(new U[sizeof...(Args)]{ std::forward<Args>(args)... });
  54. }
  55. }
  56.  
  57.  
  58.  
  59.  
  60. int main() {
  61. std::string ss("hello");
  62. auto u_str = future::make_unique<std::string>(ss);
  63. std::cout << u_str->c_str() <<std::endl;
  64. std::cout << *u_str <<std::endl;
  65. return 0;
  66. }
Success #stdin #stdout 0s 3272KB
stdin
Standard input is empty
stdout
hello
hello