diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h index c018ecd9a2610c823241f3b482d799598e37aa8b..d6d8a49a944aa190c47152aced4065bd15a19885 100644 --- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h +++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h @@ -4,6 +4,7 @@ #include <queue> #include <thread> #include <functional> +#include <type_traits> #include <ArmarXCore/core/ComponentPlugin.h> #include <ArmarXCore/core/ManagedIceObject.h> @@ -66,6 +67,18 @@ namespace armarx void addSkill(const skills::LambdaSkill::FunT&, const skills::SkillDescription&); void addSkill(std::unique_ptr<skills::Skill>&&); + template<typename T> + T* addSkill() + { + 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* skillPtr = skill.get(); + addSkill(std::move(skill)); + return static_cast<T*>(skillPtr); + } + private: armarx::plugins::SkillProviderComponentPlugin* plugin = nullptr;