diff --git a/rclcpp/include/rclcpp/parameter.hpp b/rclcpp/include/rclcpp/parameter.hpp index 271960b..cd0c43f 100644 --- a/rclcpp/include/rclcpp/parameter.hpp +++ b/rclcpp/include/rclcpp/parameter.hpp @@ -80,6 +80,8 @@ public: rcl_interfaces::msg::ParameterValue get_parameter_value() const; + // The following get_value() variants require the use of ParameterType + template typename std::enable_if::type get_value() const @@ -125,8 +127,8 @@ public: } template - typename std::enable_if &>::type + typename std::enable_if< + type == ParameterType::PARAMETER_BYTES, const std::vector &>::type get_value() const { if (value_.type != rcl_interfaces::msg::ParameterType::PARAMETER_BYTES) { @@ -136,6 +138,46 @@ public: return value_.bytes_value; } + // The following get_value() variants allow the use of primitive types + + template + typename std::enable_if< + std::is_integral::value && !std::is_same::value, int64_t>::type + get_value() const + { + return get_value(); + } + + template + typename std::enable_if::value, double>::type + get_value() const + { + return get_value(); + } + + template + typename std::enable_if::value, const std::string &>::type + get_value() const + { + return get_value(); + } + + template + typename std::enable_if::value, bool>::type + get_value() const + { + return get_value(); + } + + template + typename std::enable_if< + std::is_convertible< + type, const std::vector &>::value, const std::vector &>::type + get_value() const + { + return get_value(); + } + RCLCPP_PUBLIC int64_t as_int() const; diff --git a/rclcpp/include/rclcpp/parameter_client.hpp b/rclcpp/include/rclcpp/parameter_client.hpp index 3b146e3..789723f 100644 --- a/rclcpp/include/rclcpp/parameter_client.hpp +++ b/rclcpp/include/rclcpp/parameter_client.hpp @@ -134,6 +134,45 @@ public: std::vector get_parameters(const std::vector & parameter_names); + RCLCPP_PUBLIC + bool + has_parameter(const std::string & parameter_name); + + template + T + get_parameter_impl( + const std::string & parameter_name, std::function parameter_not_found_handler) + { + std::vector names; + names.push_back(parameter_name); + auto vars = get_parameters(names); + if ((vars.size() != 1) || (vars[0].get_type() == rclcpp::parameter::PARAMETER_NOT_SET)) { + return parameter_not_found_handler(); + } else { + return static_cast(vars[0].get_value()); + } + } + + template + T + get_parameter(const std::string & parameter_name, const T & default_value) + { + // *INDENT-OFF* + return get_parameter_impl(parameter_name, + std::function([&default_value]() -> T {return default_value; })); + // *INDENT-ON* + } + + template + T + get_parameter(const std::string & parameter_name) + { + // *INDENT-OFF* + return get_parameter_impl(parameter_name, + std::function([]() -> T {throw std::runtime_error("Parameter not set"); })); + // *INDENT-ON* + } + RCLCPP_PUBLIC std::vector get_parameter_types(const std::vector & parameter_names); diff --git a/rclcpp/src/rclcpp/parameter_client.cpp b/rclcpp/src/rclcpp/parameter_client.cpp index 5d82a6d..f59e1dc 100644 --- a/rclcpp/src/rclcpp/parameter_client.cpp +++ b/rclcpp/src/rclcpp/parameter_client.cpp @@ -259,6 +259,15 @@ SyncParametersClient::get_parameters(const std::vector & parameter_ return std::vector(); } +bool +SyncParametersClient::has_parameter(const std::string & parameter_name) +{ + std::vector names; + names.push_back(parameter_name); + auto vars = list_parameters(names, 1); + return vars.names.size() > 0; +} + std::vector SyncParametersClient::get_parameter_types(const std::vector & parameter_names) {