diff --git a/src/blackmisc/variant.h b/src/blackmisc/variant.h index 17e8da961..24d6c59a3 100644 --- a/src/blackmisc/variant.h +++ b/src/blackmisc/variant.h @@ -127,12 +127,6 @@ namespace BlackMisc return CVariant(QVariant::fromValue(std::forward(value))); } - //! Call a function and construct a variant from its return value. - template static CVariant fromResultOf(F &&func) - { - return fromResultOfImpl(std::forward(func), typename std::is_void::type()); - } - //! Change the value. template void setValue(T &&value) { m_v.setValue(std::forward(value)); } @@ -296,9 +290,6 @@ namespace BlackMisc return result; } bool isVariantList() const; - - template static CVariant fromResultOfImpl(F &&func, std::true_type) { std::forward(func)(); return {}; } - template static CVariant fromResultOfImpl(F &&func, std::false_type) { return from(std::forward(func)()); } }; } // namespace diff --git a/src/blackmisc/worker.cpp b/src/blackmisc/worker.cpp index 7c13d6c66..f2ab3de34 100644 --- a/src/blackmisc/worker.cpp +++ b/src/blackmisc/worker.cpp @@ -67,14 +67,14 @@ namespace BlackMisc Q_UNUSED(ok) } - CWorker *CWorker::fromTaskImpl(QObject *owner, const QString &name, int typeId, const std::function &task) + CWorker *CWorker::fromTaskImpl(QObject *owner, const QString &name, int typeId, const std::function &task) { auto *worker = new CWorker(task); emit worker->aboutToStart(); worker->setStarted(); auto *thread = new CRegularThread(owner); - if (typeId != QMetaType::Void) { worker->m_result = CVariant(typeId, nullptr); } + if (typeId != QMetaType::Void) { worker->m_result = QVariant(typeId, nullptr); } const QString ownerName = owner->objectName().isEmpty() ? owner->metaObject()->className() : owner->objectName(); thread->setObjectName(ownerName + ":" + name); diff --git a/src/blackmisc/worker.h b/src/blackmisc/worker.h index 44552cded..28d414714 100644 --- a/src/blackmisc/worker.h +++ b/src/blackmisc/worker.h @@ -17,7 +17,6 @@ #include "blackmisc/invoke.h" #include "blackmisc/promise.h" #include "blackmisc/stacktrace.h" -#include "blackmisc/variant.h" #include #include @@ -30,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -211,7 +211,7 @@ namespace BlackMisc static CWorker *fromTask(QObject *owner, const QString &name, F &&task) { int typeId = qMetaTypeId(task)())>>(); - return fromTaskImpl(owner, name, typeId, [task = std::forward(task)]() mutable { return CVariant::fromResultOf(std::move(task)); }); + return fromTaskImpl(owner, name, typeId, [task = std::forward(task)]() mutable { return fromResultOf(std::move(task), 0); }); } //! Connects to a functor to which will be passed the result when the task is finished. @@ -252,14 +252,19 @@ namespace BlackMisc void ps_runTask(); private: - CWorker(const std::function &task) : m_task(task) {} - static CWorker *fromTaskImpl(QObject *owner, const QString &name, int typeId, const std::function &task); + CWorker(const std::function &task) : m_task(task) {} + static CWorker *fromTaskImpl(QObject *owner, const QString &name, int typeId, const std::function &task); + + template + static auto fromResultOf(F &&func, std::enable_if_t::value, int>) { func(); return QVariant(); } + template + static auto fromResultOf(F &&func, std::enable_if_t::value, int>) { return QVariant::fromValue(func()); } template R resultNoWait() { Q_ASSERT(m_result.canConvert()); return m_result.value(); } - std::function m_task; - CVariant m_result; + std::function m_task; + QVariant m_result; }; /*!