diff --git a/src/language/BuiltinFunctionEmbedder.hpp b/src/language/BuiltinFunctionEmbedder.hpp index d6040f7be2e1f71621b1297bfe080f3cdd8b5584..99d76590b5cf001b20342991e7dde794a6f639e0 100644 --- a/src/language/BuiltinFunctionEmbedder.hpp +++ b/src/language/BuiltinFunctionEmbedder.hpp @@ -54,7 +54,7 @@ class BuiltinFunctionEmbedder : public IBuiltinFunctionEmbedder _copy_value(ArgsTuple& t, const std::vector<DataVariant>& v) const { std::visit( - [&](auto v_i) { + [&](auto&& v_i) { using Ti_Type = std::decay_t<decltype(std::get<I>(t))>; using Vi_Type = std::decay_t<decltype(v_i)>; @@ -63,9 +63,13 @@ class BuiltinFunctionEmbedder : public IBuiltinFunctionEmbedder } else if constexpr ((std::is_arithmetic_v<Vi_Type>)and(std::is_arithmetic_v<Ti_Type> or std::is_same_v<Ti_Type, std::string>)) { std::get<I>(t) = v_i; - } else if constexpr (is_shared_ptr_v<Ti_Type> and std::is_same_v<Vi_Type, EmbeddedData>) { - auto data_handler = static_cast<const DataHandler<typename Ti_Type::element_type>&>(v_i.get()); - std::get<I>(t) = data_handler.data_ptr(); + } else if constexpr (is_shared_ptr_v<Ti_Type>) { + if constexpr (std::is_same_v<Vi_Type, EmbeddedData>) { + auto data_handler = static_cast<const DataHandler<typename Ti_Type::element_type>&>(v_i.get()); + std::get<I>(t) = data_handler.data_ptr(); + } else { + throw std::runtime_error("unexpected argument types while casting: expecting EmbeddedData"); + } } else { std::ostringstream os; os << "unexpected argument types while casting " << demangle<Vi_Type>() << " -> " << demangle<Ti_Type>()