尝试实现这样的函数,该函数将以字符串形式生成其类名,而无需手动键入。发现PRETTY_FUNCTION可以完成此工作,并且msvc 2022表示该二进制文件|找不到使用std::string_view类型的左手数的运算符。如何修复?
static constexpr std::string_view ClassName() {
constexpr std::string_view pretty_function = std::source_location::current().function_name();
consteval auto tokens = pretty_function | std::ranges::views::split([](std::string_view view) { return view == " "; })
| std::ranges::views::transform([](const std::string_view&& token) {
return token.compare("class") == 0 ? std::string_view{} : token;
});
for (const auto && token : tokens) {
if (token.find('<') != std::string_view::npos) {
return token.substr(0, token.find('<'));
}
} return tokens.back();
}
2条答案
按热度按时间nx7onnlm1#
如果你需要从基类中得到derivedclass的名字,那么你显然需要
virtual
函数,而不是static
。为了减少代码,你只需要使用宏。简单方法:
如果你不想每次都输入类名,你也可以这么做,但是要复杂一点,比如:
用于获取从此处复制的类型名称的代码:https://stackoverflow.com/a/68139582/11680056
eagi6jfj2#
我想了想不同的方法,似乎这不知为什么错过了。
下面是我自己的解决方案(不知道它是否能在MSVC 20以外的其他编译器中工作: