summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Goffart <olivier.goffart@nokia.com>2011-04-20 16:13:03 +0200
committerOlivier Goffart <olivier.goffart@nokia.com>2011-05-10 12:54:54 +0200
commit91f5144f9042d100e1dd91b4fcf1b12969e3b8d3 (patch)
tree277a4291dd0ec543fdd8fb12e241f756453722e3
parent9c3911741968ffaf249d4e23c2c092b7ec135fdb (diff)
Compile with msvc
msvc tries to instenties the return type of overloads that are not chosen by overload resolution (cherry picked from commit 7307d712e10783b57c4c95c8390a9455b69f473a)
-rw-r--r--src/corelib/concurrent/qtconcurrentfunctionwrappers.h20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/corelib/concurrent/qtconcurrentfunctionwrappers.h b/src/corelib/concurrent/qtconcurrentfunctionwrappers.h
index 4c4714fe45..fa675eb336 100644
--- a/src/corelib/concurrent/qtconcurrentfunctionwrappers.h
+++ b/src/corelib/concurrent/qtconcurrentfunctionwrappers.h
@@ -195,6 +195,18 @@ QtConcurrent::ConstMemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func
return QtConcurrent::ConstMemberFunctionWrapper<T, C>(func);
}
+
+template<typename T>
+void *lazyResultType_helper(int, typename T::result_type * = 0);
+template<typename T>
+char lazyResultType_helper(double);
+
+template <typename Functor, bool foo = sizeof(lazyResultType_helper<Functor>(0)) != sizeof(void*)>
+struct LazyResultType { typedef typename Functor::result_type Type; };
+template <typename Functor>
+struct LazyResultType<Functor, true> { typedef void Type; };
+
+
template <class T>
struct ReduceResultType;
@@ -213,7 +225,7 @@ struct ReduceResultType<T(C::*)(U)>
template <class InputSequence, class MapFunctor>
struct MapResultType
{
- typedef typename MapFunctor::result_type ResultType;
+ typedef typename LazyResultType<MapFunctor>::Type ResultType;
};
template <class U, class V>
@@ -233,7 +245,7 @@ struct MapResultType<void, T(C::*)() const>
template <template <typename> class InputSequence, typename MapFunctor, typename T>
struct MapResultType<InputSequence<T>, MapFunctor>
{
- typedef InputSequence<typename MapFunctor::result_type> ResultType;
+ typedef InputSequence<typename LazyResultType<MapFunctor>::Type> ResultType;
};
template <template <typename> class InputSequence, class T, class U, class V>
@@ -251,7 +263,7 @@ struct MapResultType<InputSequence<T>, U(C::*)() const>
template <template <typename, typename> class InputSequence, typename MapFunctor, typename T, typename T2>
struct MapResultType<InputSequence<T, T2>, MapFunctor>
{
- typedef InputSequence<typename MapFunctor::result_type, T2> ResultType;
+ typedef InputSequence<typename LazyResultType<MapFunctor>::Type, T2> ResultType;
};
template <template <typename, typename> class InputSequence, class T, typename T2, class U, class V>
@@ -271,7 +283,7 @@ struct MapResultType<InputSequence<T, T2>, U(C::*)() const>
template <class MapFunctor>
struct MapResultType<QStringList, MapFunctor>
{
- typedef QList<typename MapFunctor::result_type> ResultType;
+ typedef QList<typename LazyResultType<MapFunctor>::Type> ResultType;
};
template <class U, class V>