Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

type trait: rclcpp::is_pointer<T> #817

Closed
wants to merge 1 commit into from
Closed

Conversation

Karsten1987
Copy link
Contributor

This is a type trait to check whether a parameter is a pointer. This is essentially an extension to std::is_pointer<T> which also checks for std::shared_ptr<T> as well as std::unique_ptr<T>.

The use case for this is to pass in a pointer to a node independently whether it's a shared pointer or a raw pointer. Motivation for this see here: https://github.com/ros/diagnostics/pull/112/files#r310801219

Signed-off-by: Karsten Knese karsten@openrobotics.org

Signed-off-by: Karsten Knese <karsten@openrobotics.org>
@Karsten1987 Karsten1987 self-assigned this Aug 6, 2019
Copy link
Member

@ivanpauno ivanpauno left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The implementation LGTM.
This could live in rcpputils repo.

If you want to use it here: https://github.com/ros/diagnostics/blob/4edd6dfe6af8950d63d29d9f436bef87a015c316/diagnostic_updater/include/diagnostic_updater/diagnostic_updater.hpp#L373-L380, I don't agree with the usage. The Updater constructor should take a rclcpp::Node &.

@Karsten1987
Copy link
Contributor Author

I am okay with having it on rcpputils, I can reopen the PR over there.

The motivation for this is actually exactly to avoid forcing a constructor taking a ‘rclcpp::Node’ because it doesn’t allow for its derivates or similar nodes such as ‘rclcpp::LifecycleNode’.

@ivanpauno
Copy link
Member

The motivation for this is actually exactly to avoid forcing a constructor taking a ‘rclcpp::Node’ because it doesn’t allow for its derivates or similar nodes such as ‘rclcpp::LifecycleNode’.

That sounds good. But I don't know why accepting all the possible pointers to them.
unique_ptr shouldn't be allowed, as both Node and LifecycleNode inherit from enable_shared_from_this.
Taking a shared_ptr is not idiomatic, as the method isn't retaining part ownership after the call (see https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-resource R32 to R36).

We are already doing something similar of what you want (which it doesn't follow the guidelines I copied either). See:

@Karsten1987
Copy link
Contributor Author

I totally agree, however there is no free functions for logger nor for parameters as far as I know which makes it hard for me to use it.

{};

template<class T>
struct is_pointer

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding some doc here would be great IMHO

@thomas-moulard
Copy link

+1 for rcpputils, happy to review the PR there.

@ivanpauno
Copy link
Member

I totally agree, however there is no free functions for logger nor for parameters as far as I know which makes it hard for me to use it.

I think we should add get_*_interface for those. The other problem with this functions, is that they are returning a raw pointer, when they should return the shared_ptr (which is available too).
@Karsten1987 If you agree with that, I can implement it and open a PR.

I don't like the idea of templated functions accepting any kind of pointer, so I'm not in favor of adding rclcpp::is_pointer.

{};

template<class T>
struct is_smart_pointer_helper<std::shared_ptr<T>>: std::true_type
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can't hide these because templates, but I assume that the helpers aren't part of the public API. might it make sense to nest them in a rcpputils::impl namespace so at least it's clear they're not part of the public API?

And agreed with thomas on value of adding some doc strings

@emersonknapp
Copy link
Collaborator

@Karsten1987 friendly ping, is the plan to move this to rcpputils?

@Karsten1987
Copy link
Contributor Author

closing in favor of ros2/rcpputils#19

@Karsten1987 Karsten1987 deleted the pointer_type_traits branch August 26, 2019 02:58
nnmm pushed a commit to ApexAI/rclcpp that referenced this pull request Jul 9, 2022
Signed-off-by: ahcorde <ahcorde@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants