4545#include " ament_index_cpp/get_package_share_directory.hpp"
4646#include " ament_index_cpp/get_resource.hpp"
4747#include " ament_index_cpp/get_resources.hpp"
48+ #include " class_loader/interface_traits.hpp"
4849#include " class_loader/class_loader.hpp"
4950#include " rcpputils/shared_library.hpp"
5051#include " rcutils/logging_macros.h"
@@ -106,14 +107,20 @@ ClassLoader<T>::~ClassLoader()
106107}
107108
108109template <class T >
109- std::shared_ptr<T> ClassLoader<T>::createSharedInstance(const std::string & lookup_name)
110+ template <typename ... Args,
111+ std::enable_if_t <class_loader::is_interface_constructible_v<T, Args...>, bool >>
112+ std::shared_ptr<T> ClassLoader<T>::createSharedInstance(
113+ const std::string & lookup_name,
114+ Args &&... args)
110115/* **************************************************************************/
111116{
112- return createUniqueInstance (lookup_name);
117+ return createUniqueInstance (lookup_name, std::forward<Args>(args)... );
113118}
114119
115120template <class T >
116- UniquePtr<T> ClassLoader<T>::createUniqueInstance(const std::string & lookup_name)
121+ template <typename ... Args,
122+ std::enable_if_t <class_loader::is_interface_constructible_v<T, Args...>, bool >>
123+ UniquePtr<T> ClassLoader<T>::createUniqueInstance(const std::string & lookup_name, Args &&... args)
117124{
118125 RCUTILS_LOG_DEBUG_NAMED (" pluginlib.ClassLoader" ,
119126 " Attempting to create managed (unique) instance for class %s." ,
@@ -128,7 +135,8 @@ UniquePtr<T> ClassLoader<T>::createUniqueInstance(const std::string & lookup_nam
128135 RCUTILS_LOG_DEBUG_NAMED (" pluginlib.ClassLoader" , " %s maps to real class type %s" ,
129136 lookup_name.c_str (), class_type.c_str ());
130137
131- UniquePtr<T> obj = lowlevel_class_loader_.createUniqueInstance <T>(class_type);
138+ UniquePtr<T> obj = lowlevel_class_loader_.createUniqueInstance <T>(class_type,
139+ std::forward<Args>(args)...);
132140
133141 RCUTILS_LOG_DEBUG_NAMED (" pluginlib.ClassLoader" ,
134142 " std::unique_ptr to object of real type %s created." ,
@@ -145,7 +153,9 @@ UniquePtr<T> ClassLoader<T>::createUniqueInstance(const std::string & lookup_nam
145153}
146154
147155template <class T >
148- T * ClassLoader<T>::createUnmanagedInstance(const std::string & lookup_name)
156+ template <typename ... Args,
157+ std::enable_if_t <class_loader::is_interface_constructible_v<T, Args...>, bool >>
158+ T * ClassLoader<T>::createUnmanagedInstance(const std::string & lookup_name, Args &&... args)
149159/* **************************************************************************/
150160{
151161 RCUTILS_LOG_DEBUG_NAMED (" pluginlib.ClassLoader" ,
@@ -163,7 +173,8 @@ T * ClassLoader<T>::createUnmanagedInstance(const std::string & lookup_name)
163173 std::string class_type = getClassType (lookup_name);
164174 RCUTILS_LOG_DEBUG_NAMED (" pluginlib.ClassLoader" , " %s maps to real class type %s" ,
165175 lookup_name.c_str (), class_type.c_str ());
166- instance = lowlevel_class_loader_.createUnmanagedInstance <T>(class_type);
176+ instance = lowlevel_class_loader_.createUnmanagedInstance <T>(class_type,
177+ std::forward<Args>(args)...);
167178 RCUTILS_LOG_DEBUG_NAMED (" pluginlib.ClassLoader" ,
168179 " Instance of type %s created." ,
169180 class_type.c_str ());
0 commit comments