@@ -59,6 +59,65 @@ struct aggregate_reports<mp11::mp_list<Reports...>, mp11::mp_list<>, Void> {
5959 struct type : Reports... {};
6060};
6161
62+ // Policy initialization helpers
63+
64+ // Detect if a policy fn has an initialize function with the expected signature
65+ template <typename PolicyFn, typename Context, typename Options, typename = void >
66+ struct has_initialize : std::false_type {};
67+
68+ #if defined(_MSC_VER) && _MSC_VER <= 1950
69+ template <typename PolicyFn, typename Context, typename Options>
70+ struct has_initialize <
71+ PolicyFn, Context, Options,
72+ std::void_t <
73+ decltype (&PolicyFn::template initialize<Context, Options>)>>
74+ : std::true_type {};
75+ #else
76+ template <typename PolicyFn, typename Context, typename Options>
77+ struct has_initialize <
78+ PolicyFn, Context, Options,
79+ std::void_t <decltype (PolicyFn::initialize(
80+ std::declval<const Context&>(), std::declval<const Options&>()))>>
81+ : std::true_type {};
82+ #endif
83+
84+ // Call initialize on a single policy if it has the function
85+ template <typename Policy, typename Registry, typename Context, typename Options>
86+ void initialize_policy (const Context& ctx, const Options& options) {
87+ using PolicyFn = typename Policy::template fn<Registry>;
88+ if constexpr (has_initialize<PolicyFn, Context, Options>::value) {
89+ PolicyFn::initialize (ctx, options);
90+ }
91+ }
92+
93+ template <typename Registry, typename Policies = typename Registry::policy_list>
94+ struct initialize_policies ;
95+
96+ template <typename Registry, typename ... Policies>
97+ struct initialize_policies <Registry, mp11::mp_list<Policies...>> {
98+ template <typename Context, typename Options>
99+ static void fn (const Context& ctx, const Options& options) {
100+ (initialize_policy<Policies, Registry>(ctx, options), ...);
101+ }
102+ };
103+
104+ // template<typename Registry, typename Policy, typename... Policies>
105+ // struct initialize_policies<Registry, mp11::mp_list<Policy, Policies...>> {
106+ // template<typename Context, typename Options>
107+ // static void fn(const Context& ctx, const Options& options) {
108+ // initialize_policy<Policy, Registry>(ctx, options);
109+ // initialize_policies<Registry, mp11::mp_list<Policies...>>::fn(
110+ // ctx, options);
111+ // }
112+ // };
113+
114+ // template<typename Registry>
115+ // struct initialize_policies<Registry, mp11::mp_list<>> {
116+ // template<typename Context, typename Options>
117+ // static void fn(const Context& ctx, const Options& options) {
118+ // }
119+ // };
120+
62121inline void merge_into (boost::dynamic_bitset<>& a, boost::dynamic_bitset<>& b) {
63122 if (b.size () < a.size ()) {
64123 b.resize (a.size ());
@@ -438,8 +497,8 @@ struct registry<Policies...>::compiler : detail::generic_compiler {
438497 static void select_dominant_overriders (
439498 std::vector<overrider*>& dominants, std::size_t & pick,
440499 std::size_t & remaining);
441- static auto
442- is_more_specific ( const overrider* a, const overrider* b) -> bool;
500+ static auto is_more_specific ( const overrider* a, const overrider* b)
501+ -> bool;
443502 static auto is_base (const overrider* a, const overrider* b) -> bool;
444503
445504 std::tuple<Options...> options;
@@ -1420,9 +1479,7 @@ void registry<Policies...>::compiler<Options...>::write_global_data() {
14201479
14211480 ++tr << rflush (4 , dispatch_data_size) << " " << gv_iter << " end\n " ;
14221481
1423- if constexpr (has_vptr) {
1424- vptr::initialize (*this , options);
1425- }
1482+ detail::initialize_policies<registry>::fn (*this , options);
14261483
14271484 new_dispatch_data.swap (storage::st.dispatch_data );
14281485}
0 commit comments