Cppgres
Build Postgres extensions in C++
Loading...
Searching...
No Matches
maybe_ref.hpp
1#pragma once
2#include <functional>
3#include <variant>
4
5namespace cppgres::utils {
6
7template <typename T> struct maybe_ref {
8 // In-place constructor: constructs T inside the variant using forwarded arguments.
9 template <typename... Args> maybe_ref(Args &&...args) : data(std::forward<Args>(args)...) {}
10 maybe_ref(const T &value) : data(value) {}
11 maybe_ref(T &ref) : data(std::ref(ref)) {}
12
13 operator T &() {
14 if (std::holds_alternative<T>(data))
15 return std::get<T>(data);
16 else
17 return std::get<std::reference_wrapper<T>>(data).get();
18 }
19
20 operator const T &() const {
21 if (std::holds_alternative<T>(data))
22 return std::get<T>(data);
23 else
24 return std::get<std::reference_wrapper<T>>(data).get();
25 }
26
27 T *operator->() { return &operator T &(); }
28 const T *operator->() const { return &operator const T &(); }
29
30 bool is_ref() const { return !std::holds_alternative<T>(data); }
31
32private:
33 std::variant<T, std::reference_wrapper<T>> data;
34};
35} // namespace cppgres::utils
Definition: maybe_ref.hpp:7
Definition: value.hpp:8