@@ -119,15 +119,50 @@ class BuildMapper<T, rc::detail::IndexSequence<Indexes...>, Lenses...> {
119119 std::tuple<Lenses...> m_lenses;
120120};
121121
122+ template <typename T, typename ... Args>
123+ typename std::enable_if<std::is_constructible<T, Args...>::value, T>::type
124+ construct (Args &&... args) {
125+ return T (std::move (args)...);
126+ }
127+
128+ template <typename T, typename ... Args>
129+ typename std::enable_if<!std::is_constructible<T, Args...>::value, T>::type
130+ construct (Args &&... args) {
131+ return T{std::move (args)...};
132+ }
133+
134+ template <typename T, typename ... Args>
135+ typename std::enable_if<std::is_constructible<T, Args...>::value, std::unique_ptr<T>>::type
136+ makeUnique (Args &&... args) {
137+ return std::unique_ptr<T>(new T (std::move (args)...));
138+ }
139+
140+ template <typename T, typename ... Args>
141+ typename std::enable_if<!std::is_constructible<T, Args...>::value, std::unique_ptr<T>>::type
142+ makeUnique (Args &&... args) {
143+ return std::unique_ptr<T>(new T{std::move (args)...});
144+ }
145+
146+ template <typename T, typename ... Args>
147+ typename std::enable_if<std::is_constructible<T, Args...>::value, std::shared_ptr<T>>::type
148+ makeShared (Args &&... args) {
149+ return std::shared_ptr<T>(new T (std::move (args)...));
150+ }
151+
152+ template <typename T, typename ... Args>
153+ typename std::enable_if<!std::is_constructible<T, Args...>::value, std::shared_ptr<T>>::type
154+ makeShared (Args &&... args) {
155+ return std::shared_ptr<T>(new T{std::move (args)...});
156+ }
122157} // namespace detail
123158
124159template <typename T, typename ... Args>
125160Gen<T> construct (Gen<Args>... gens) {
126161 return gen::map (gen::tuple (std::move (gens)...),
127162 [](std::tuple<Args...> &&argsTuple) {
128163 return rc::detail::applyTuple (
129- std::move (argsTuple),
130- []( Args && ... args) { return T{ std::move (args)...}; } );
164+ std::move (argsTuple),
165+ detail::construct<T, Args...> );
131166 });
132167}
133168
@@ -141,22 +176,19 @@ Gen<std::unique_ptr<T>> makeUnique(Gen<Args>... gens) {
141176 return gen::map (gen::tuple (std::move (gens)...),
142177 [](std::tuple<Args...> &&argsTuple) {
143178 return rc::detail::applyTuple (
144- std::move (argsTuple),
145- [](Args &&... args) {
146- return std::unique_ptr<T>(new T{std::move (args)...});
147- });
179+ std::move (argsTuple),
180+ detail::makeUnique<T, Args...>);
148181 });
149182}
150183
151184template <typename T, typename ... Args>
152185Gen<std::shared_ptr<T>> makeShared (Gen<Args>... gens) {
153186 return gen::map (gen::tuple (std::move (gens)...),
154187 [](std::tuple<Args...> &&argsTuple) {
155- return rc::detail::applyTuple (std::move (argsTuple),
156- [](Args &&... args) {
157- return std::make_shared<T>(
158- std::move (args)...);
159- });
188+ return rc::detail::applyTuple (
189+ std::move (argsTuple),
190+ detail::makeShared<T, Args...>
191+ );
160192 });
161193}
162194
0 commit comments