From 3ab1888aa33a05419f53bf111d9001b57c60a593 Mon Sep 17 00:00:00 2001
From: Christoph Pohl <christoph.pohl@kit.edu>
Date: Mon, 17 Jul 2023 15:46:51 +0200
Subject: [PATCH] use perfect forwarding to add skills with non-default
 constructors

---
 .../skills/provider/SkillProviderComponentPlugin.h | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h
index 6b74dd1e2..ab6c8c466 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h
+++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h
@@ -46,16 +46,14 @@ namespace armarx::plugins
         void addSkill(const skills::LambdaSkill::FunT&, const skills::SkillDescription&);
         void addSkill(std::unique_ptr<skills::Skill>&&);
 
-        template <typename T>
+        template <typename T, typename... Args>
         T*
-        addSkill()
+        addSkill(Args&&... args)
         {
             static_assert(std::is_base_of<skills::Skill, T>::value,
                           "T must be derived from skills::Skill!");
-            static_assert(std::is_default_constructible<T>::value,
-                          "T must be default constructible!");
 
-            auto skill = std::make_unique<T>();
+            auto skill = std::make_unique<T>(std::forward<Args>(args)...);
             auto* skillPtr = skill.get();
             addSkill(std::move(skill));
             return static_cast<T*>(skillPtr);
@@ -111,11 +109,11 @@ namespace armarx
         void addSkill(const skills::LambdaSkill::FunT&, const skills::SkillDescription&);
         void addSkill(std::unique_ptr<skills::Skill>&&);
 
-        template <typename T>
+        template <typename T, typename... Args>
         T*
-        addSkill()
+        addSkill(Args&&... args)
         {
-            return plugin->addSkill<T>();
+            return plugin->addSkill<T>(std::forward<Args>(args)...);
         }
 
     private:
-- 
GitLab