c++ - 当其中一个是函数参数时,在编译时连接 const char
问题描述
我正在尝试为 spdlog 中的每个日志字符串添加一个文件名前缀。Spdlog 格式化字符串如下所示:
Test log {}
日志是这样写的:
spdlog::error("Test log {}", value)
我试图在格式化字符串之前包装这个调用并连接额外的 {},所以我可以在那里传递文件的前缀。
static constexpr char * prefixHolder("{} ");
template<typename... Args>
void critical(const char fmt[], Args&&... args) const
{
constexpr auto fullFmt = prefixHolder + fmt; //I can't find any solution for this
spdlog::critical(fullFmt, m_prefix, std::forward<Args>(args)...);
}
Log log("MyClassOrLogger");
log.critical("My format {}", value);
是否可以在编译时解决这个问题?我尝试了一些方法,但我还没有找到任何方法来为编译器制作输入 fmt 参数 constexpr。
C++ 17
有什么建议或解决方案吗?
谢谢
解决方案
参数值不能用于 constexpr。
你可能会转:
template<typename... Args>
constexpr void critical(const char fmt[], Args&&... args)
进入
template <char... cs, typename... Args>
void critical(std::integer_sequence<char, cs...>, Args&&... args)
{
constexpr char fullFmt[] = {'{', '}', ' ', cs... , '\0'};
spdlog::critical(fullFmt, m_prefix, std::forward<Args>(args)...);
}
允许拥有 constexpr char 数组。
ensure-that-char-pointers-always-point-to-the-same-string-literal显示了从文字字符串创建类似序列的方法。在您的情况下,它将是:
template <typename Char, Char... Cs>
constexpr auto operator"" _cs() -> std::integer_sequence<Char, Cs...> {
return {};
}
用法是这样的:
log.critical("My format {}"_cs, value); // gcc extension
log.critical(MAKE_SEQUENCE("My format {}"), value);
推荐阅读
- c++ - SFINAE:“enable_if”不能用于禁用此声明
- reactjs - source.uri 不应为空字符串
- python - 选择字典中的项目
- javascript - 给定值范围内的百分比
- c++ - 如何对从 unique_ptrs 中提取的非拥有原始指针向量进行建模?
- javascript - 如何使用 jquery 访问 ng-template 属性
- vb.net - 如何在没有索引号或列字母的广泛硬编码的情况下引用 Excel 范围
- javascript - mat-table 不记得在分页期间选择每行上的所有复选框状态
- react-native - 使用 detox 通过 ID 测试查找元素 - React Native
- python - 用大写字母分隔的熊猫数据框中的字符串替换字符串