From 83d212fe0f837708c2f3b2a1ba24ed596cc5415b Mon Sep 17 00:00:00 2001 From: elsid Date: Mon, 6 Mar 2023 00:12:11 +0100 Subject: [PATCH] Use SFINAE to avoid conflicts between visit functions --- components/esm/esmbridge.hpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/components/esm/esmbridge.hpp b/components/esm/esmbridge.hpp index 8810e30594..ee6238cbc6 100644 --- a/components/esm/esmbridge.hpp +++ b/components/esm/esmbridge.hpp @@ -18,6 +18,15 @@ namespace ESM struct CellId; class RefId; + class CellVariant; + + template + using Substitute = T; + + template + using VisitReturnType = std::enable_if_t<(std::is_base_of_v> && ...), + typename std::invoke_result...>::type>; + class CellVariant { protected: @@ -39,7 +48,7 @@ namespace ESM const ESM::Cell& getEsm3() const; template - friend auto visit(F&& f, T&&... v); + friend VisitReturnType visit(F&& f, T&&... v); }; struct ReferenceVariant @@ -66,7 +75,7 @@ namespace ESM }; template - auto visit(F&& f, T&&... v) + VisitReturnType visit(F&& f, T&&... v) { return std::visit([&](auto*... ptr) { return std::forward(f)(*ptr...); }, std::forward(v).mVariant...); }