guanaqo 1.0.0-alpha.25
Utilities for scientific software
Loading...
Searching...
No Matches
type-traits.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file
4/// @ingroup core
5/// Lightweight type-trait helpers.
6
7#include <concepts>
8#include <memory>
9#include <type_traits>
10
11namespace guanaqo {
12
13template <class M>
15
16template <class C, class Ret, class... Args>
17struct class_from_member_ptr_impl<Ret (C::*)(Args...)> {
18 using type = C;
19};
20
21template <class C, class Ret, class... Args>
22struct class_from_member_ptr_impl<Ret (C::*)(Args...) const> {
23 using type = std::add_const_t<C>;
24};
25
26template <class M>
29
30/// @addtogroup core
31/// @{
32
33template <auto M>
35
36template <class First, class... Pack>
37struct last_type {
38 using type = typename last_type<Pack...>::type;
39};
40template <class Only>
41struct last_type<Only> {
42 using type = Only;
43};
44template <class... Pack>
45using last_type_t = typename last_type<Pack...>::type;
46
47template <class... Pack>
49template <class First, class... Pack>
50struct first_type_or_void<First, Pack...> {
51 using type = First;
52};
53template <>
55 using type = void;
56};
57template <class... Pack>
58using first_type_or_void_t = typename first_type_or_void<Pack...>::type;
59
60template <class... Pack>
62 !std::is_same_v<std::remove_cvref_t<first_type_or_void_t<Pack...>>,
63 std::allocator_arg_t>;
64
65/// @}
66
67} // namespace guanaqo
typename last_type< Pack... >::type type
typename last_type< Pack... >::type last_type_t
class_from_member_ptr_impl_t< decltype(M)> class_from_member_ptr_t
typename first_type_or_void< Pack... >::type first_type_or_void_t
typename class_from_member_ptr_impl< M >::type class_from_member_ptr_impl_t