summaryrefslogtreecommitdiffstats
path: root/src
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 /src
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)
Diffstat (limited to 'src')
-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>