A simple, header-only cpp library implementing smart pointer type traits.
You can easily compile your code diffrently depending on which pointer-type is used.
You can detect inheritance too and you won't have trouble with const, volatile qualifiers.
It also contains member detections. (SFINAE based)
Type traits are generally used for static assertions and static polymorphism. (C++ 17 if constexpr)
However, the standard library's type traits do not support smart pointers, and do not detect inheritance.
This is why smart pointer type traits are made.
Version 2.0 released.
https://github.com/MyeongWoonJang/cpp-smart-pointer-type-trait/releases/tag/v2.0
If you are looking for old versions, visit here.
All you need to to is copy over the smart_pointer_type_trait.hpp header file.
Include it in your solution, and you are good to go.
All evaluations occurs after removing const, volatile, reference.
Implementations are in namespace woon2.
#include "smart_pointer_type_trait.hpp" // include the header file.
// ...
woon2::is_smart_ptr_v<T>; // usage guide 1
using namespace woon2; // usage guide 2
is_smart_ptr_v<T>;
// ...- is_pointable
template < typename T >
using is_pointable = detail::is_pointable_impl< detail::remove_cvr_t< T > >;is_ptr<T>::value/is_ptr_v<T> is true if T has operator* and operator->.
detects all pointable classes such as std::unique_ptr<T>, std::shared_ptr<T>, T*.
- is_smart_ptr
template < typename T >
using is_smart_ptr = std::conditional_t<
is_shared_ptr_v< T >,
std::true_type,
std::conditional_t<
is_unique_ptr_v< T >,
std::true_type,
std::false_type
>
>;is_smart_ptr<T>::value/is_smart_ptr_v<T> is true if T is std::shared_ptr or std::unique_ptr.
- is_shared_ptr
template < typename T >
using is_shared_ptr = detail::is_shared_ptr_impl< detail::remove_cvr_t< T > >;is_shared_ptr<T>::value/is_shared_ptr_v<T> is true if T is std::shared_ptr.
- is_unique_ptr
template < typename T >
using is_unique_ptr = detail::is_unique_ptr_impl< detail::remove_cvr_t< T > >;is_unique_ptr<T>::value/is_unique_ptr_v<T> is true if T is std::unique_ptr.
- is_smart_ptr_soft
template < typename T >
using is_smart_ptr_soft = decltype( detail::is_smart_ptr_soft_impl( std::declval< detail::remove_cvr_t< T >* >() ) );is_smart_ptr_soft<T>::value/is_smart_ptr_soft_v<T> is true if T is derived from std::shared_ptr or std::unique_ptr.
- is_shared_ptr_soft
template < typename T >
using is_shared_ptr_soft = decltype( detail::is_shared_ptr_soft_impl( std::declval< detail::remove_cvr_t< T >* >() ) );is_shared_ptr_soft<T>::value/is_shared_ptr_soft_v<T> is true if T is derived from std::shared_ptr.
- is_unique_ptr_soft
template < typename T >
using is_unique_ptr_soft = decltype( detail::is_unique_ptr_soft_impl( std::declval< detail::remove_cvr_t< T >* >() ) );is_unique_ptr_soft<T>::value/is_unique_ptr_soft_v<T> is true if T is derived from std::unique_ptr.
- has_reset
template < typename T >
using has_reset = detail::has_reset_impl< detail::remove_cvr_t< T > >; has_reset<T>::value/has_reset_v<T> is true if T has reset() as a member.
- has_release
template < typename T >
using has_release = detail::has_release_impl< detail::remove_cvr_t< T > >; has_release<T>::value/has_release_v<T> is true if T has release() as a member.
- has_get_deleter
template < typename T >
using has_get_deleter = detail::has_get_deleter_impl< detail::remove_cvr_t< T > >; has_get_deleter<T>::value/has_get_deleter_v<T> is true if T has get_deleter() as a member.
- has_swap
template < typename T >
using has_swap = detail::has_swap_impl< detail::remove_cvr_t< T > >; has_swap<T>::value/has_swap_v<T> is true if T has swap(detail::remove_cvr_t<T>&) as a member.
(detail::remove_cvr_t<T>& is a l-value reference of the pointer.)
examples of using member detections are on other examples. (example2, example3)
we are welcoming your contributions!😊
How to write a type trait is container or is vector - stackoverflow
Concept for Smart Pointers - stackoverflow
씹어먹는 C++ - <16 - 3. 타입을 알려주는 키워드 decltype 와 친구 std::declval> - blog
std::conditional - cppreference
SFINAE - cppreference