我有一组日志函数,它们接受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(我或多或少可以,因为日志记录仅用于调试),最重要的是,这不能在构造函数中使用。
我该怎么办?这似乎是一件微不足道的事情,但我就是找不到一个好的解决方案。
1条答案
按热度按时间6yt4nkrj1#
最后,我用
std::string_view
替换了std::string
参数,并在需要C字符串的情况下将其转换为std::string
(因为std::string_view
不能保证以null结尾)。然后我就可以使用static constexpr std::string_view kTag = "ClassName"
来存储标签了。