C++ 当其中一个是函数参数时,在编译时连接const char

C++ 当其中一个是函数参数时,在编译时连接const char,c++,c++17,constexpr,C++,C++17,Constexpr,我正在尝试为spdlog中的每个日志字符串添加文件名前缀。 Spdlog格式字符串如下所示: 测试日志{} 日志的编写方式如下: spdlog::error(“测试日志{}”,值) 我试图在格式化字符串之前包装这个调用并连接其他{},这样我就可以在那里传递文件的前缀 static constexpr char * prefixHolder("{} "); template<typename... Args> void critical(const char fm

我正在尝试为spdlog中的每个日志字符串添加文件名前缀。 Spdlog格式字符串如下所示:

测试日志{}

日志的编写方式如下:
spdlog::error(“测试日志{}”,值)

我试图在格式化字符串之前包装这个调用并连接其他{},这样我就可以在那里传递文件的前缀

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);
staticconsteprchar*prefixHolder({});
模板
无效临界值(常量字符fmt[],参数&&…参数)常量
{
constexpr auto fullFmt=prefixHolder+fmt;//我找不到任何解决方案
spdlog::critical(fullFmt、m_前缀、std::forward(args)…);
}
日志(“MyClassOrLogger”);
log.critical(“我的格式{}”,值);
有可能在编译时解决这个问题吗?我已经尝试了一些方法,但还没有找到任何方法使编译器的输入fmt参数constexpr

C++17

有什么建议或解决办法吗


谢谢,参数值不能用于constexpr

你可以转向:

template<typename... Args>
constexpr void critical(const char fmt[], Args&&... args)
带有gcc扩展。

使用宏。

它会出于某种原因将_csliteral转换为const char[]
错误:没有匹配函数用于调用“Log::critical(const char[6])”logger.critical(“Hello”_cs)生成字符串示例缺少对齐的字符串。我发现了一个类似的实现,但在您的一个回复中有两个模板参数,但它仍然无法为我编译。与_cs的问题相同。链接中的gcc 7.3.1@jarod42代码需要一些修改,带有gcc扩展。您能帮助制作字符串示例吗?扩展变量的可移植性与我有关。提供了
MAKE_CHAR_SEQUENCE
,它提供了一个
模板结构CHAR_SEQUENCE
,您可以使用它来代替
std::integer_SEQUENCE
。否则你可以创建特征,将前者转化为后者。添加了便携式演示。是的,你是对的。纠正
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)...);
}
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);