fork download
  1. #include <iostream>
  2. #include <fstream>
  3. #include <memory>
  4. #include <vector>
  5.  
  6. // dense boilerplate, obsolete in C++1y:
  7. template<unsigned...>struct indexes{typedef indexes type;};
  8. template<unsigned Max,unsigned...Is>struct make_indexes:make_indexes<Max-1,Max-1,Is...>{};
  9. template<unsigned...Is>struct make_indexes<0,Is...>:indexes<Is...>{};
  10. template<unsigned Max>using make_indexes_t=typename make_indexes<Max>::type;
  11.  
  12. template<typename T>using type=T;
  13.  
  14. template<typename... Args>
  15. struct up_maker {
  16. std::tuple<Args...> args;
  17. template<class T, class...Ds, unsigned...Is>
  18. std::unique_ptr<T,Ds...> helper( indexes<Is...> ) && {
  19. return std::unique_ptr<T,Ds...>( new T(std::forward<Args>( std::get<Is>(args) )...) );
  20. }
  21. template<class T, class...Ds>
  22. operator type<std::unique_ptr<T,Ds...>>() && {
  23. return std::move(*this).helper<T,Ds...>( make_indexes_t< sizeof...(Args) >{} );
  24. }
  25. explicit up_maker( Args&&... args_in ):args( std::forward<Args>(args_in)... ) {}
  26. up_maker( up_maker const& ) = delete;
  27. up_maker( up_maker && ) = default;
  28. up_maker& operator=( up_maker const& ) = delete;
  29. up_maker& operator=( up_maker && ) = default;
  30. };
  31.  
  32. template<typename...Args>
  33. up_maker<Args...> make_up( Args&&... args ) {
  34. return up_maker<Args...>( std::forward<Args>(args)... );
  35. }
  36.  
  37.  
  38.  
  39. int main() {
  40. std::vector<std::unique_ptr<std::ofstream>> v;
  41. v.emplace_back(make_up("file1.txt"));
  42. v.emplace_back(make_up("file2.txt"));
  43. for (int i = 0, ilen = v.size(); i < ilen; ++i)
  44. (*v[i]) << "Test" << i << std::endl;
  45. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
Standard output is empty