@@ -58,7 +58,7 @@ struct apply_scalar_unary<F, T, require_eigen_t<T>> {
5858 * @return Componentwise application of the function specified
5959 * by F to the specified matrix.
6060 */
61- static inline auto apply (const T & x) {
61+ static inline auto apply (const std:: decay_t <T> & x) {
6262 return x.unaryExpr ([](auto && x) {
6363 return apply_scalar_unary<F, std::decay_t <decltype (x)>>::apply (x);
6464 });
@@ -69,7 +69,7 @@ struct apply_scalar_unary<F, T, require_eigen_t<T>> {
6969 * expression template of type T.
7070 */
7171 using return_t = std::decay_t <decltype (
72- apply_scalar_unary<F, T >::apply(std::declval<T>()))>;
72+ apply_scalar_unary<F, std:: decay_t <T> >::apply(std::declval<T>()))>;
7373};
7474
7575/* *
@@ -83,7 +83,8 @@ struct apply_scalar_unary<F, T, require_floating_point_t<T>> {
8383 /* *
8484 * The return type, double.
8585 */
86- using return_t = std::decay_t <decltype (F::fun(std::declval<T>()))>;
86+ using return_t
87+ = std::decay_t <decltype (F::fun(std::declval<std::decay_t <T>>()))>;
8788
8889 /* *
8990 * Apply the function specified by F to the specified argument.
@@ -114,11 +115,12 @@ struct apply_scalar_unary<F, T, require_complex_t<T>> {
114115 * @param x Argument scalar.
115116 * @return Result of applying F to the scalar.
116117 */
117- static inline auto apply (const T & x) { return F::fun (x); }
118+ static inline auto apply (const std:: decay_t <T> & x) { return F::fun (x); }
118119 /* *
119120 * The return type
120121 */
121- using return_t = std::decay_t <decltype (F::fun(std::declval<T>()))>;
122+ using return_t
123+ = std::decay_t <decltype (F::fun(std::declval<std::decay_t <T>>()))>;
122124};
123125
124126/* *
@@ -157,13 +159,13 @@ struct apply_scalar_unary<F, T, require_integral_t<T>> {
157159 * @tparam T Type of element contained in standard vector.
158160 */
159161template <typename F, typename T>
160- struct apply_scalar_unary <F, std::vector <T>> {
162+ struct apply_scalar_unary <F, T, require_std_vector_t <T>> {
161163 /* *
162164 * Return type, which is calculated recursively as a standard
163165 * vector of the return type of the contained type T.
164166 */
165- using return_t = typename std::vector<
166- plain_type_t < typename apply_scalar_unary<F, T >::return_t >>;
167+ using return_t = typename std::vector<plain_type_t <
168+ typename apply_scalar_unary<F, value_type_t <std:: decay_t <T>> >::return_t >>;
167169
168170 /* *
169171 * Apply the function specified by F elementwise to the
@@ -174,10 +176,10 @@ struct apply_scalar_unary<F, std::vector<T>> {
174176 * @return Elementwise application of F to the elements of the
175177 * container.
176178 */
177- static inline auto apply (const std::vector <T>& x) {
179+ static inline auto apply (const std::decay_t <T>& x) {
178180 return_t fx (x.size ());
179181 for (size_t i = 0 ; i < x.size (); ++i) {
180- fx[i] = apply_scalar_unary<F, T >::apply (x[i]);
182+ fx[i] = apply_scalar_unary<F, value_type_t <T> >::apply (x[i]);
181183 }
182184 return fx;
183185 }
0 commit comments