@@ -26,6 +26,9 @@ along with Daemon Source Code. If not, see <http://www.gnu.org/licenses/>.
2626#define COMMON_VECTOR_H_
2727
2828#include < ostream>
29+ #include < type_traits>
30+
31+ template <typename Func, typename ... Args> using resultof_t = decltype ( std::declval<Func>()( std::declval<Args...> ) );
2932
3033namespace Math {
3134
@@ -87,9 +90,9 @@ namespace Math {
8790 void Store (Type* ptr) const ;
8891
8992 // Apply a function on all elements of the vector
90- template <typename Func> Vector<Dimension, typename std::result_of <Func( Type)>::type > Apply (Func func) const ;
91- template <typename Func, typename Type2> Vector<Dimension, typename std::result_of <Func( Type, Type2)>::type > Apply2 (Func func, Vector<Dimension, Type2> other) const ;
92- template <typename Func, typename Type2, typename Type3> Vector<Dimension, typename std::result_of <Func( Type, Type2, Type3)>::type > Apply3 (Func func, Vector<Dimension, Type2> other1, Vector<Dimension, Type3> other2) const ;
93+ template <typename Func> Vector<Dimension, resultof_t <Func, Type> > Apply (Func func) const ;
94+ template <typename Func, typename Type2> Vector<Dimension, resultof_t <Func, Type, Type2> > Apply2 (Func func, Vector<Dimension, Type2> other) const ;
95+ template <typename Func, typename Type2, typename Type3> Vector<Dimension, resultof_t <Func, Type, Type2, Type3> > Apply3 (Func func, Vector<Dimension, Type2> other1, Vector<Dimension, Type3> other2) const ;
9396
9497 // Reduce the elements of the vector to a single value
9598 template <typename Func> Type Reduce (Type init, Func func);
@@ -843,25 +846,25 @@ namespace Math {
843846
844847 // VectorBase::Apply/Apply2/Apply3
845848 template <size_t Dimension, typename Type> template <typename Func>
846- Vector<Dimension, typename std::result_of <Func( Type)>::type > VectorBase<Dimension, Type>::Apply(Func func) const
849+ Vector<Dimension, resultof_t <Func, Type> > VectorBase<Dimension, Type>::Apply(Func func) const
847850 {
848- Vector<Dimension, typename std::result_of <Func ( Type)>::type > out;
851+ Vector<Dimension, resultof_t <Func, Type> > out;
849852 for (size_t i = 0 ; i < Dimension; i++)
850853 out.data [i] = func (data[i]);
851854 return out;
852855 }
853856 template <size_t Dimension, typename Type> template <typename Func, typename Type2>
854- Vector<Dimension, typename std::result_of <Func( Type, Type2)>::type > VectorBase<Dimension, Type>::Apply2(Func func, Vector<Dimension, Type2> other) const
857+ Vector<Dimension, resultof_t <Func, Type, Type2> > VectorBase<Dimension, Type>::Apply2(Func func, Vector<Dimension, Type2> other) const
855858 {
856- Vector<Dimension, typename std::result_of <Func (Type, Type2)>::type > out;
859+ Vector<Dimension, resultof_t <Func (Type, Type2)>> out;
857860 for (size_t i = 0 ; i < Dimension; i++)
858861 out.data [i] = func (data[i], other.data [i]);
859862 return out;
860863 }
861864 template <size_t Dimension, typename Type> template <typename Func, typename Type2, typename Type3>
862- Vector<Dimension, typename std::result_of <Func( Type, Type2, Type3)>::type > VectorBase<Dimension, Type>::Apply3(Func func, Vector<Dimension, Type2> other1, Vector<Dimension, Type3> other2) const
865+ Vector<Dimension, resultof_t <Func, Type, Type2, Type3> > VectorBase<Dimension, Type>::Apply3(Func func, Vector<Dimension, Type2> other1, Vector<Dimension, Type3> other2) const
863866 {
864- Vector<Dimension, typename std::result_of <Func ( Type, Type2, Type3)>::type > out;
867+ Vector<Dimension, resultof_t <Func, Type, Type2, Type3> > out;
865868 for (size_t i = 0 ; i < Dimension; i++)
866869 out.data [i] = func (data[i], other1.data [i], other2.data [i]);
867870 return out;
0 commit comments