c++ 存储字符串字面量以将其作为std::string传递

uqzxnwby  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(134)

我有一组日志函数,它们接受const std::string &标记参数,该参数应该是调用类的名称。为了使用这些函数,我想为每个类存储一个字符串文字,这样就不必为每个日志调用手动键入类名。
问题是,我找不到一个理想的解决方案来存储这些字符串,所以它的效率或高或低,并且不需要为每个日志调用编写样板代码。
以下是我看到的选项,每个选项都不完美:
1.在每个类中将标签存储为static constexpr const char kTag[] = "ClassName"--这使得clang-tidy抱怨我应该使用std::array
1.在每个类中将标记存储为static constexpr std::array kTag{"ClassName"}--这不能隐式转换为std::string,我必须为每个调用编写kTag[0]以获得char *
1.将标记存储为static constexpr std::string_view kTag = "ClassName"--这也不能被无限制地转换为std::string
1.我不想使用#define s,因为我试图遵循Google C风格指南,该指南说应该避免预处理器指令。
1.我不想使用std::string来存储标签,原因与#define相同-- Google C
风格指南说静态变量应该是可平凡破坏的。
1.我甚至考虑过创建一个宏,将typeid(*this).name()作为标记传递,但这是一个预处理器指令,需要RTTI(我或多或少可以,因为日志记录仅用于调试),最重要的是,这不能在构造函数中使用。
我该怎么办?这似乎是一件微不足道的事情,但我就是找不到一个好的解决方案。

6yt4nkrj

6yt4nkrj1#

最后,我用std::string_view替换了std::string参数,并在需要C字符串的情况下将其转换为std::string(因为std::string_view不能保证以null结尾)。然后我就可以使用static constexpr std::string_view kTag = "ClassName"来存储标签了。

相关问题