@@ -58,6 +58,21 @@ template <typename T> struct traits {
5858 }
5959};
6060
61+ template <typename LhsRep, typename RhsRep, typename = void >
62+ struct common_rep_traits {
63+ static constexpr bool enabled = false ;
64+ };
65+
66+ template <typename LhsRep, typename RhsRep>
67+ struct common_rep_traits <
68+ LhsRep, RhsRep,
69+ std::void_t <std::common_type_t <std::remove_cv_t <LhsRep>,
70+ std::remove_cv_t <RhsRep>>>> {
71+ using type =
72+ std::common_type_t <std::remove_cv_t <LhsRep>, std::remove_cv_t <RhsRep>>;
73+ static constexpr bool enabled = true ;
74+ };
75+
6176} // namespace underlying
6277} // namespace mcpplibs::primitives
6378
@@ -134,6 +149,15 @@ concept has_consistent_category =
134149 (traits<std::remove_cv_t <T>>::kind == category::integer ||
135150 traits<std::remove_cv_t <T>>::kind == category::floating)));
136151
152+ template <typename LhsRep, typename RhsRep>
153+ concept has_common_rep =
154+ common_rep_traits<std::remove_cv_t <LhsRep>,
155+ std::remove_cv_t <RhsRep>>::enabled &&
156+ requires {
157+ typename common_rep_traits<std::remove_cv_t <LhsRep>,
158+ std::remove_cv_t <RhsRep>>::type;
159+ };
160+
137161} // namespace mcpplibs::primitives::underlying::details
138162
139163export namespace mcpplibs ::primitives {
@@ -168,4 +192,12 @@ concept floating_underlying_type =
168192template <typename T>
169193concept numeric_underlying_type =
170194 integer_underlying_type<T> || floating_underlying_type<T>;
195+
196+ template <typename LhsRep, typename RhsRep>
197+ concept has_common_rep = underlying::details::has_common_rep<LhsRep, RhsRep>;
198+
199+ template <typename LhsRep, typename RhsRep>
200+ using common_rep_t =
201+ underlying::common_rep_traits<std::remove_cv_t <LhsRep>,
202+ std::remove_cv_t <RhsRep>>::type;
171203} // namespace mcpplibs::primitives
0 commit comments