diff --git a/include/stdx/ct_string.hpp b/include/stdx/ct_string.hpp index 7f7cf29..ae0c129 100644 --- a/include/stdx/ct_string.hpp +++ b/include/stdx/ct_string.hpp @@ -202,5 +202,25 @@ concept named = requires { template constexpr auto name_of_v = T::name; template using constant_name_of_t = cts_t; template constexpr auto constant_name_of_v = constant_name_of_t{}; + +template +concept matching_name = T::name == Name; + +template +using matching_name_t = std::bool_constant>; + +template struct matching_name_q { + template using fn = matching_name_t; +}; + +template +concept same_name = named and named and matching_name>; + +template +using same_name_t = std::bool_constant>; + +template struct same_name_q { + template using fn = same_name_t; +}; } // namespace v1 } // namespace stdx diff --git a/test/ct_string.cpp b/test/ct_string.cpp index 43f82c5..b2f9cf9 100644 --- a/test/ct_string.cpp +++ b/test/ct_string.cpp @@ -199,4 +199,16 @@ TEST_CASE("named object", "[ct_string]") { STATIC_CHECK(stdx::named); STATIC_CHECK(stdx::name_of_v == "test"_cts); STATIC_CHECK(stdx::constant_name_of_v == "test"_ctst); + + STATIC_CHECK(stdx::matching_name); + STATIC_CHECK(stdx::matching_name_t::value); + STATIC_CHECK(stdx::matching_name_q<"test">::template fn::value); + + using U = stdx::with_name<"not test">; + STATIC_CHECK(stdx::same_name); + STATIC_CHECK(stdx::same_name_t::value); + STATIC_CHECK(stdx::same_name_q::template fn::value); + STATIC_CHECK(not stdx::same_name); + STATIC_CHECK(not stdx::same_name_t::value); + STATIC_CHECK(not stdx::same_name_q::template fn::value); }