@@ -119,15 +119,51 @@ 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::forward<Args>(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::forward<Args>(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::forward<Args>(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::forward<Args>(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::forward<Args>(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::forward<Args>(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::forward<std::tuple<Args...>>(argsTuple),
165+ detail::construct<T, Args...>
166+ );
131167 });
132168}
133169
@@ -141,22 +177,20 @@ Gen<std::unique_ptr<T>> makeUnique(Gen<Args>... gens) {
141177 return gen::map (gen::tuple (std::move (gens)...),
142178 [](std::tuple<Args...> &&argsTuple) {
143179 return rc::detail::applyTuple (
144- std::move (argsTuple),
145- [](Args &&... args) {
146- return std::unique_ptr<T>(new T{std::move (args)...});
147- });
180+ std::forward<std::tuple<Args...>>(argsTuple),
181+ detail::makeUnique<T, Args...>
182+ );
148183 });
149184}
150185
151186template <typename T, typename ... Args>
152187Gen<std::shared_ptr<T>> makeShared (Gen<Args>... gens) {
153188 return gen::map (gen::tuple (std::move (gens)...),
154189 [](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- });
190+ return rc::detail::applyTuple (
191+ std::forward<std::tuple<Args...>>(argsTuple),
192+ detail::makeShared<T, Args...>
193+ );
160194 });
161195}
162196
0 commit comments