From 8b4784cf2fd3e2561f7d6182d7686b0bc3c9340d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 25 Jul 2018 23:39:12 +0200 Subject: [PATCH] Trade: MSVC workarounds. I almost forgot those were still a thing. --- src/Magnum/Trade/AbstractImporter.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Magnum/Trade/AbstractImporter.h b/src/Magnum/Trade/AbstractImporter.h index aa6c3867e..7c178336a 100644 --- a/src/Magnum/Trade/AbstractImporter.h +++ b/src/Magnum/Trade/AbstractImporter.h @@ -1114,10 +1114,12 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi #ifndef DOXYGEN_GENERATING_OUTPUT template void AbstractImporter::setFileCallback(Callback callback, T& userData) { - /* Don't try to wrap a null function pointer */ - if(!callback) return setFileCallback(nullptr); + /* Don't try to wrap a null function pointer. Need to cast first because + MSVC (even 2017) can't apply ! to a lambda. Ugh. */ + const auto callbackPtr = static_cast(*)(const std::string&, ImporterFileCallbackPolicy, T&)>(callback); + if(!callbackPtr) return setFileCallback(nullptr); - _fileCallbackTemplate = { reinterpret_cast(static_cast(*)(const std::string&, ImporterFileCallbackPolicy, T&)>(callback)), &userData }; + _fileCallbackTemplate = { reinterpret_cast(callbackPtr), &userData }; setFileCallback([](const std::string& filename, const ImporterFileCallbackPolicy flags, void* const userData) { auto& s = *reinterpret_cast(userData); return reinterpret_cast(*)(const std::string&, ImporterFileCallbackPolicy, T&)>(s.callback)(filename, flags, *static_cast(s.userData));