diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp
index 8bcf8338726c29094ada9aa81cc74a69812b7150..0ed1a250ab31b69f64afd236ad20462aab05fc95 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp
@@ -577,8 +577,7 @@ namespace armarx::RobotUnitModule
                     //dimensions of sensor value (e.g. vel, tor, f_x, f_y, ...)
                     for (std::size_t idxField = 0; idxField < val->getNumberOfDataFields(); ++ idxField)
                     {
-                        std::string str;
-                        val->getDataFieldAs(idxField, str);
+                        const auto  str = val->getDataFieldAs<std::string>(idxField);
                         for (auto& [_, entry] : rtLoggingEntries)
                         {
                             if (entry->loggedSensorDeviceValues.at(idxDev).at(idxField))
diff --git a/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueBase.h b/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueBase.h
index 18d537b291f6c204036ec14e467a92e9660144df..7afa43be267682cfd23bf38eccf073b54f6cdca3 100644
--- a/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueBase.h
+++ b/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueBase.h
@@ -99,6 +99,14 @@ namespace armarx
         virtual void getDataFieldAs(std::size_t i, Ice::Float&  out) const = 0;
         virtual void getDataFieldAs(std::size_t i, Ice::Double& out) const = 0;
         virtual void getDataFieldAs(std::size_t i, std::string& out) const = 0;
+        template<class T>
+        T getDataFieldAs(std::size_t i) const
+        {
+            ARMARX_TRACE;
+            T t;
+            this->getDataFieldAs(i, t);
+            return t;
+        }
         virtual const std::type_info& getDataFieldType(std::size_t i) const = 0;
 
         //management functions
diff --git a/source/RobotAPI/components/units/RobotUnit/util/introspection/DataFieldsInfo.h b/source/RobotAPI/components/units/RobotUnit/util/introspection/DataFieldsInfo.h
index 49e77ca8b8afb43e7308a8e53316c297fb283e4e..015f386b6e752380c4e5b07e1867d9b2e30ac894 100644
--- a/source/RobotAPI/components/units/RobotUnit/util/introspection/DataFieldsInfo.h
+++ b/source/RobotAPI/components/units/RobotUnit/util/introspection/DataFieldsInfo.h
@@ -325,7 +325,8 @@ namespace armarx::introspection
         static void GetDataFieldAs(std::size_t i, const std::array<T, N>& field, OT& out)
         {
             ARMARX_CHECK_LESS(i, GetNumberOfFields());
-            sub_t::GetDataFieldAs(i % N, field.at(i / N), out);
+            const auto subN = sub_t::GetNumberOfFields();
+            sub_t::GetDataFieldAs(i % subN, field.at(i / subN), out);
         }
 
         static const std::type_info& GetDataFieldType(std::size_t i)