Iros
 
Loading...
Searching...
No Matches
create_in_place.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/vocab.h"
6#include "di/types/prelude.h"
7#include "di/util/forward.h"
8
9namespace di::util {
10namespace detail {
12
13 template<typename T, typename... Args>
17
18 template<typename T, typename... Args>
19 concept StaticCreatable = requires(Args&&... args) {
20 { T::create(util::forward<Args>(args)...) } -> concepts::MaybeFallible<T>;
21 };
22
24 template<typename T, typename... Args>
25 requires(concepts::ConstructibleFrom<T, Args...> || CustomCreatable<T, Args...> || StaticCreatable<T, Args...>)
26 constexpr auto operator()(InPlaceType<T>, Args&&... args) const {
27 if constexpr (concepts::ConstructibleFrom<T, Args...>) {
28 return T(util::forward<Args>(args)...);
29 } else if constexpr (CustomCreatable<T, Args...>) {
30 return function::tag_invoke(*this, in_place_type<T>, util::forward<Args>(args)...);
31 } else {
32 return T::create(util::forward<Args>(args)...);
33 }
34 }
35 };
36}
37
39}
40
41namespace di {
43}
Definition operations.h:11
Definition vocab.h:74
Definition tag_invoke.h:33
Definition create_in_place.h:14
Definition create_in_place.h:19
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition clamp.h:9
Definition vocab.h:96
constexpr auto create_in_place
Definition create_in_place.h:38
Definition zstring_parser.h:9
constexpr auto in_place_type
Definition in_place_type.h:12
@ T
Definition key.h:29
Definition in_place_type.h:5
Definition create_in_place.h:23