ROL
Accessor_CPP17.hpp
Go to the documentation of this file.
1#ifndef ACCESSOR_HPP
2#define ACCESSOR_HPP
3
4#include <type_traits>
5#include <utility>
6
7// --- C++17 Trait Definitions ---
8
9// 1. Trait to check if T is a specialization of Accessor (from previous answer)
10template <typename T>
11struct is_accessor_specialization_trait_cpp17 : std::false_type {};
12template <typename VectorType>
13struct is_accessor_specialization_trait_cpp17<Accessor<VectorType>> : std::true_type {};
14
15// 2. Trait to check for member types
16template <typename T, typename = void>
17struct has_required_member_types : std::false_type {};
18
19template <typename T>
20
21 typename T::value_type,
22 typename T::size_type
23 >> : std::true_type {};
24
25// 3. Trait to check for get_value method (if member types exist)
26template <typename T, bool HasTypes, typename = void> // bool HasTypes is a precondition
27struct has_correct_get_value_method : std::false_type {};
28
29template <typename T>
30struct has_correct_get_value_method<T, /* HasTypes = */ true,
31 std::void_t<decltype(
32 std::declval<const T&>().get_value(
33 std::declval<const typename T::container_type&>(),
34 std::declval<typename T::size_type>()
35 )
36 )>
37> : std::is_same<
38 decltype(
39 std::declval<const T&>().get_value(
40 std::declval<const typename T::container_type&>(),
41 std::declval<typename T::size_type>()
42 )
43 ),
44 typename T::value_type
45 > {};
46
47// 4. Trait to check for set_value method (if member types exist)
48template <typename T, bool HasTypes, typename = void> // bool HasTypes is a precondition
49struct has_correct_set_value_method : std::false_type {};
50
51template <typename T>
52struct has_correct_set_value_method<T, /* HasTypes = */ true,
53 std::void_t<decltype(
54 std::declval<const T&>().set_value(
55 std::declval<typename T::container_type&>(), // Note: non-const container
56 std::declval<typename T::size_type>(),
57 std::declval<typename T::value_type>()
58 )
59 )>
60> : std::is_same< // Check return type is void
61 decltype(
62 std::declval<const T&>().set_value(
63 std::declval<typename T::container_type&>(),
64 std::declval<typename T::size_type>(),
65 std::declval<typename T::value_type>()
66 )
67 ),
68 void
69 > {};
70
71// 5. Combine all checks for C++17
72template<typename T>
74private:
77 // Only check methods if it's a specialization AND has the types, to avoid hard errors with declval on non-existent types
80
81public:
82 static constexpr bool value = is_specialization && has_types && has_get && has_set;
83};
84
85
86template <typename T>
88
89#endif // ACCESSOR_HPP
constexpr bool is_compliant_accessor_v
static constexpr bool has_get
static constexpr bool has_set
static constexpr bool has_types
static constexpr bool is_specialization
static constexpr bool value