#include <string_view>
namespace LoginModule {
struct LoginManager {
enum class LoginMsg {
LOGIN,
LOGOUT,
};
};
}
enum class RunMsg {
NEW_RUN,
LOAD_RUN,
DEL_RUN,
};
template<char... chars>
static constexpr const char staticString[] = { chars... };
template <auto E, typename = std::enable_if_t<std::is_enum_v<decltype(E)>>>
constexpr auto GetEnumIdentity() {
constexpr std::string_view signature = __FUNCSIG__;
constexpr auto enumName = signature.substr(signature.find_first_of('<') + 1,
signature.find_last_of(':') - signature.find_first_of('<') - 2);
constexpr auto enumValue = static_cast<char>(E);
constexpr auto identity = []<std::size_t...seqIdx>(std::index_sequence<seqIdx...>) {
return staticString<enumName[seqIdx]..., enumValue, '\0'>;
}(std::make_index_sequence<enumName.size()>{});
return identity;
}
template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
constexpr auto GetEnumIdentity(T t) {
constexpr const char* signature = __FUNCSIG__;
return signature + static_cast<int>(t);
}
int main()
{
constexpr const char* enumId0 = GetEnumIdentity<RunMsg::DEL_RUN>();
constexpr const char* enumId1 = GetEnumIdentity(LoginModule::LoginManager::LoginMsg::LOGIN);
constexpr const char* enumId2 = GetEnumIdentity(LoginModule::LoginManager::LoginMsg::LOGOUT);
constexpr const char* enumId3 = GetEnumIdentity(RunMsg::NEW_RUN);
constexpr const char* enumId4 = GetEnumIdentity(RunMsg::LOAD_RUN);
constexpr const char* enumId5 = GetEnumIdentity(RunMsg::DEL_RUN);
}
C++编译期生成枚举唯一标识
于 2024-10-15 17:29:30 首次发布