Advertisement
Radfler

::emplace

May 7th, 2016
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.90 KB | None | 0 0
  1. #include <new>
  2. #include <type_traits>
  3. #include <utility>
  4.  
  5. namespace details {
  6.  
  7.   template<typename Type>
  8.   struct emplace_arg_t { };
  9.  
  10.   template<typename T, typename... Args>
  11.   void emplace(emplace_arg_t<T>, void* location, Args&&... args)
  12.   noexcept(std::is_nothrow_constructible<T, Args&&...>::value) {
  13.     new (location) T(std::forward<Args>(args)...);
  14.   }
  15.  
  16.   template<typename... Args>
  17.   void emplace(emplace_arg_t<void>, void* location, Args&&... args)
  18.   noexcept(noexcept(new (location) auto(std::forward<Args>(args)...))) {
  19.     new (location) auto(std::forward<Args>(args)...);
  20.   }
  21.  
  22. }
  23.  
  24. template<typename Type = void, typename... Args>
  25. void emplace(void* location, Args&&... args)
  26. noexcept(noexcept(details::emplace(details::emplace_arg_t<Type>{}, location, std::forward<Args>(args)...))) {
  27.   details::emplace(details::emplace_arg_t<Type>{}, location, std::forward<Args>(args)...);
  28. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement