Tatooine
holder.h
Go to the documentation of this file.
1#ifndef TATOOINE_HOLDER_H
2#define TATOOINE_HOLDER_H
3//==============================================================================
4#include <memory>
5
6#include "type_traits.h"
7//==============================================================================
8namespace tatooine {
9//==============================================================================
11 virtual ~base_holder() = default;
12};
13
14template <typename T>
16 using held_type = T;
17 //----------------------------------------------------------------------------
18 protected:
20 //----------------------------------------------------------------------------
21 public:
22 template <typename _T>
23 holder(_T&& obj) : m_held_object{std::forward<_T>(obj)} {}
24 virtual ~holder() = default;
25 //----------------------------------------------------------------------------
26 const auto& get() const { return m_held_object; }
27 auto& get() { return m_held_object; }
28};
29
30// copy when having rvalue
31template <typename T>
32holder(T &&)->holder<T>;
33
34// keep reference when having lvalue
35template <typename T>
36holder(const T&)->holder<const T&>;
37
38template <typename T>
39auto hold(T&& t) {
40 return std::unique_ptr<base_holder>{new holder{std::forward<T>(t)}};
41}
42//==============================================================================
43} // namespace tatooine
44//==============================================================================
45#endif
Definition: algorithm.h:6
static constexpr forward_tag forward
Definition: tags.h:9
auto hold(T &&t)
Definition: holder.h:39
Definition: holder.h:10
virtual ~base_holder()=default
Definition: holder.h:15
T m_held_object
Definition: holder.h:19
virtual ~holder()=default
const auto & get() const
Definition: holder.h:26
T held_type
Definition: holder.h:16
holder(_T &&obj)
Definition: holder.h:23
auto & get()
Definition: holder.h:27