userver: utils::StrongTypedef< Tag, T, Ops, class > Class Template Reference
⚠️ This is the documentation for an old userver version. Click here to switch to the latest version.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
utils::StrongTypedef< Tag, T, Ops, class > Class Template Reference

Strong typedef for a type T. More...

+ Inheritance diagram for utils::StrongTypedef< Tag, T, Ops, class >:
+ Collaboration diagram for utils::StrongTypedef< Tag, T, Ops, class >:

Public Types

using UnderlyingType = T
 
using TagType = Tag
 

Public Member Functions

 StrongTypedef (const StrongTypedef &)=default
 
 StrongTypedef (StrongTypedef &&) noexcept=default
 
StrongTypedefoperator= (const StrongTypedef &)=default
 
StrongTypedefoperator= (StrongTypedef &&) noexcept=default
 
constexpr StrongTypedef (impl::strong_typedef::InitializerList< T > lst)
 
template<typename... Args, typename = std::enable_if_t<std::is_constructible_v<T, Args...>>>
constexpr StrongTypedef (Args &&... args) noexcept(noexcept(T(std::forward< Args >(args)...)))
 
constexpr operator const T & () const &noexcept
 
constexpr operator T () &&noexcept
 
constexpr operator T& () &noexcept
 
constexpr const T & GetUnderlying () const &noexcept
 
constexprGetUnderlying () &&noexcept
 
constexpr T & GetUnderlying () &noexcept
 
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<T, Void>>
auto begin ()
 
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<T, Void>>
auto end ()
 
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<const T, Void>>
auto begin () const
 
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<const T, Void>>
auto end () const
 
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<const T, Void>>
auto cbegin () const
 
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<const T, Void>>
auto cend () const
 
template<typename Void = void, typename = impl::strong_typedef::EnableIfSizeable<const T, Void>>
auto size () const
 
auto empty () const
 
auto clear ()
 
template<class Arg >
decltype(autooperator[] (Arg &&i)
 
template<class Arg >
decltype(autooperator[] (Arg &&i) const
 

Static Public Attributes

static constexpr StrongTypedefOps kOps = Ops
 

Detailed Description

template<class Tag, class T, StrongTypedefOps Ops, class>
class utils::StrongTypedef< Tag, T, Ops, class >

Strong typedef for a type T.

Typical usage:

Or:

struct MyString final : utils::StrongTypedef<MyString, std::string> {
using StrongTypedef::StrongTypedef;
};

Has all the:

  • comparison (see "Operators" below)
  • hashing
  • streaming operators
  • optimizaed logging for LOG_XXX()

If used with container-like type also has common STL functions:

  • begin()
  • end()
  • cbegin()
  • cend()
  • size()
  • empty()
  • clear()
  • operator[]

Operators: You can customize the operators that are available by passing the third argument of type StrongTypedefOps. See its docs for more info.

Examples
postgresql/functional_tests/basic_chaos/postgres_service.cpp, samples/digest_auth_service/auth_digest.cpp, samples/postgres_auth/auth_bearer.cpp, samples/postgres_auth/user_info_cache.hpp, and samples/postgres_service/postgres_service.cpp.

Definition at line 161 of file strong_typedef.hpp.

Member Typedef Documentation

◆ TagType

template<class Tag , class T , StrongTypedefOps Ops, class >
using utils::StrongTypedef< Tag, T, Ops, class >::TagType = Tag

Definition at line 170 of file strong_typedef.hpp.

◆ UnderlyingType

template<class Tag , class T , StrongTypedefOps Ops, class >
using utils::StrongTypedef< Tag, T, Ops, class >::UnderlyingType = T

Definition at line 169 of file strong_typedef.hpp.

Constructor & Destructor Documentation

◆ StrongTypedef() [1/2]

template<class Tag , class T , StrongTypedefOps Ops, class >
constexpr utils::StrongTypedef< Tag, T, Ops, class >::StrongTypedef ( impl::strong_typedef::InitializerList< T >  lst)
inlineconstexpr

Definition at line 179 of file strong_typedef.hpp.

◆ StrongTypedef() [2/2]

template<class Tag , class T , StrongTypedefOps Ops, class >
template<typename... Args, typename = std::enable_if_t<std::is_constructible_v<T, Args...>>>
constexpr utils::StrongTypedef< Tag, T, Ops, class >::StrongTypedef ( Args &&...  args)
inlineexplicitconstexprnoexcept

Definition at line 184 of file strong_typedef.hpp.

Member Function Documentation

◆ begin() [1/2]

template<class Tag , class T , StrongTypedefOps Ops, class >
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<T, Void>>
auto utils::StrongTypedef< Tag, T, Ops, class >::begin ( )
inline

Definition at line 203 of file strong_typedef.hpp.

◆ begin() [2/2]

template<class Tag , class T , StrongTypedefOps Ops, class >
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<const T, Void>>
auto utils::StrongTypedef< Tag, T, Ops, class >::begin ( ) const
inline

Definition at line 215 of file strong_typedef.hpp.

◆ cbegin()

template<class Tag , class T , StrongTypedefOps Ops, class >
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<const T, Void>>
auto utils::StrongTypedef< Tag, T, Ops, class >::cbegin ( ) const
inline

Definition at line 227 of file strong_typedef.hpp.

◆ cend()

template<class Tag , class T , StrongTypedefOps Ops, class >
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<const T, Void>>
auto utils::StrongTypedef< Tag, T, Ops, class >::cend ( ) const
inline

Definition at line 233 of file strong_typedef.hpp.

◆ clear()

template<class Tag , class T , StrongTypedefOps Ops, class >
auto utils::StrongTypedef< Tag, T, Ops, class >::clear ( )
inline

Definition at line 245 of file strong_typedef.hpp.

◆ empty()

template<class Tag , class T , StrongTypedefOps Ops, class >
auto utils::StrongTypedef< Tag, T, Ops, class >::empty ( ) const
inline

Definition at line 243 of file strong_typedef.hpp.

◆ end() [1/2]

template<class Tag , class T , StrongTypedefOps Ops, class >
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<T, Void>>
auto utils::StrongTypedef< Tag, T, Ops, class >::end ( )
inline

Definition at line 209 of file strong_typedef.hpp.

◆ end() [2/2]

template<class Tag , class T , StrongTypedefOps Ops, class >
template<typename Void = void, typename = impl::strong_typedef::EnableIfRange<const T, Void>>
auto utils::StrongTypedef< Tag, T, Ops, class >::end ( ) const
inline

Definition at line 221 of file strong_typedef.hpp.

◆ GetUnderlying() [1/3]

template<class Tag , class T , StrongTypedefOps Ops, class >
constexpr T utils::StrongTypedef< Tag, T, Ops, class >::GetUnderlying ( ) &&
inlineconstexprnoexcept

Definition at line 198 of file strong_typedef.hpp.

◆ GetUnderlying() [2/3]

template<class Tag , class T , StrongTypedefOps Ops, class >
constexpr T & utils::StrongTypedef< Tag, T, Ops, class >::GetUnderlying ( ) &
inlineconstexprnoexcept

Definition at line 199 of file strong_typedef.hpp.

◆ GetUnderlying() [3/3]

template<class Tag , class T , StrongTypedefOps Ops, class >
constexpr const T & utils::StrongTypedef< Tag, T, Ops, class >::GetUnderlying ( ) const &
inlineconstexprnoexcept

Definition at line 197 of file strong_typedef.hpp.

◆ operator const T &()

template<class Tag , class T , StrongTypedefOps Ops, class >
constexpr utils::StrongTypedef< Tag, T, Ops, class >::operator const T & ( ) const &
inlineexplicitconstexprnoexcept

Definition at line 193 of file strong_typedef.hpp.

◆ operator T()

template<class Tag , class T , StrongTypedefOps Ops, class >
constexpr utils::StrongTypedef< Tag, T, Ops, class >::operator T ( ) &&
inlineexplicitconstexprnoexcept

Definition at line 194 of file strong_typedef.hpp.

◆ operator T&()

template<class Tag , class T , StrongTypedefOps Ops, class >
constexpr utils::StrongTypedef< Tag, T, Ops, class >::operator T& ( ) &
inlineexplicitconstexprnoexcept

Definition at line 195 of file strong_typedef.hpp.

◆ operator[]() [1/2]

template<class Tag , class T , StrongTypedefOps Ops, class >
template<class Arg >
decltype(auto) utils::StrongTypedef< Tag, T, Ops, class >::operator[] ( Arg &&  i)
inline

Definition at line 248 of file strong_typedef.hpp.

◆ operator[]() [2/2]

template<class Tag , class T , StrongTypedefOps Ops, class >
template<class Arg >
decltype(auto) utils::StrongTypedef< Tag, T, Ops, class >::operator[] ( Arg &&  i) const
inline

Definition at line 252 of file strong_typedef.hpp.

◆ size()

template<class Tag , class T , StrongTypedefOps Ops, class >
template<typename Void = void, typename = impl::strong_typedef::EnableIfSizeable<const T, Void>>
auto utils::StrongTypedef< Tag, T, Ops, class >::size ( ) const
inline

Definition at line 239 of file strong_typedef.hpp.

Member Data Documentation

◆ kOps

template<class Tag , class T , StrongTypedefOps Ops, class >
constexpr StrongTypedefOps utils::StrongTypedef< Tag, T, Ops, class >::kOps = Ops
staticconstexpr

Definition at line 171 of file strong_typedef.hpp.


The documentation for this class was generated from the following file: