diff --git a/docs/ct_string.adoc b/docs/ct_string.adoc index f386ed1..6f93b02 100644 --- a/docs/ct_string.adoc +++ b/docs/ct_string.adoc @@ -145,6 +145,21 @@ static_assert(stdx::constant_name_of_v == "name"_ctst>); using N = stdx::constant_name_of_t; // stdx::cts_t<"name"> ---- +==== `name_for` and `constant_name_for` + +When you don't know whether or not a type has a name, `name_for` will return +either its name or a `ct_string` of its type. `constant_name_for` will return +the same content as a `cts_t`. + +[source,cpp] +---- +static_assert(stdx::name_for() == "name"_cts); +static_assert(stdx::name_for() == "int"_cts); + +static_assert(stdx::constant_name_for() == "name"_ctst); +static_assert(stdx::constant_name_for() == "int"_ctst); +---- + ==== `matching_name` and `same_name` Use the `matching_name` concept to check whether a type's name matches a string. diff --git a/include/stdx/ct_string.hpp b/include/stdx/ct_string.hpp index ae0c129..9dff838 100644 --- a/include/stdx/ct_string.hpp +++ b/include/stdx/ct_string.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -222,5 +223,18 @@ using same_name_t = std::bool_constant>; template struct same_name_q { template using fn = same_name_t; }; + +template consteval auto name_for() { + if constexpr (named) { + return name_of_v; + } else { + constexpr auto name = type_as_string(); + return ct_string{name}; + } +} + +template consteval auto constant_name_for() { + return cts_t()>{}; +} } // namespace v1 } // namespace stdx diff --git a/test/ct_string.cpp b/test/ct_string.cpp index b2f9cf9..079a6b7 100644 --- a/test/ct_string.cpp +++ b/test/ct_string.cpp @@ -212,3 +212,12 @@ TEST_CASE("named object", "[ct_string]") { STATIC_CHECK(not stdx::same_name_t::value); STATIC_CHECK(not stdx::same_name_q::template fn::value); } + +TEST_CASE("name or type fallback", "[ct_string]") { + using namespace stdx::ct_string_literals; + using T = stdx::with_name<"test">; + STATIC_CHECK(stdx::name_for() == "test"_cts); + STATIC_CHECK(stdx::name_for() == "int"_cts); + STATIC_CHECK(stdx::constant_name_for() == "test"_ctst); + STATIC_CHECK(stdx::constant_name_for() == "int"_ctst); +}