@@ -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,7 @@ 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 = std::decay_t <decltype (F::fun(std::declval<std:: decay_t <T> >()))>;
8787
8888 /* *
8989 * Apply the function specified by F to the specified argument.
@@ -114,11 +114,11 @@ struct apply_scalar_unary<F, T, require_complex_t<T>> {
114114 * @param x Argument scalar.
115115 * @return Result of applying F to the scalar.
116116 */
117- static inline auto apply (const T & x) { return F::fun (x); }
117+ static inline auto apply (const std:: decay_t <T> & x) { return F::fun (x); }
118118 /* *
119119 * The return type
120120 */
121- using return_t = std::decay_t <decltype (F::fun(std::declval<T >()))>;
121+ using return_t = std::decay_t <decltype (F::fun(std::declval<std:: decay_t <T> >()))>;
122122};
123123
124124/* *
@@ -157,13 +157,13 @@ struct apply_scalar_unary<F, T, require_integral_t<T>> {
157157 * @tparam T Type of element contained in standard vector.
158158 */
159159template <typename F, typename T>
160- struct apply_scalar_unary <F, std::vector <T>> {
160+ struct apply_scalar_unary <F, T, require_std_vector_t <T>> {
161161 /* *
162162 * Return type, which is calculated recursively as a standard
163163 * vector of the return type of the contained type T.
164164 */
165165 using return_t = typename std::vector<
166- plain_type_t <typename apply_scalar_unary<F, T >::return_t >>;
166+ plain_type_t <typename apply_scalar_unary<F, value_type_t <std:: decay_t <T>> >::return_t >>;
167167
168168 /* *
169169 * Apply the function specified by F elementwise to the
@@ -174,10 +174,10 @@ struct apply_scalar_unary<F, std::vector<T>> {
174174 * @return Elementwise application of F to the elements of the
175175 * container.
176176 */
177- static inline auto apply (const std::vector <T>& x) {
177+ static inline auto apply (const std::decay_t <T>& x) {
178178 return_t fx (x.size ());
179179 for (size_t i = 0 ; i < x.size (); ++i) {
180- fx[i] = apply_scalar_unary<F, T >::apply (x[i]);
180+ fx[i] = apply_scalar_unary<F, value_type_t <T> >::apply (x[i]);
181181 }
182182 return fx;
183183 }
0 commit comments