生成编译时函数字符串以使用 libfmt 格式化字符串
Generating compile time functions string for formatting strings with libfmt
我想在标准输出中创建一个漂亮的 table。 table 有很多 headers 主要是编译时字符串。例如:
std::cout << fmt::format("|{0:-^80}|\n", "File Information");
以上打印:
|-----------------------------File Information------------------------------|
我有很多不同类型的填充和对齐宽度。我决定制作一些辅助函数:
constexpr static
std::string_view
headerCenter(const std::string& text, const int width, const char fill) {
// build fmt string
const std::string_view format = "{:" + 'fill' + '^' + toascii(width) + '}';
return fmt::format(format, text);
}
我在编译时遇到这个错误:
Constexpr function never produces a constant expression
我做错了什么,如何正确做?
格式字符串的类型和函数的return类型不能是string_view
,因为格式字符串是动态构造的,使用string_view
会导致悬空指针。
另外,fmt::format
要求格式字符串必须是常量表达式。相反,您需要使用 fmt::vformat
。这应该有效
static std::string
headerCenter(const std::string& text, const int width, const char fill) {
// build fmt string
std::string format = fmt::format("|{{0:{}^{}}}|", fill, width);
return fmt::vformat(format, fmt::make_format_args(text));
}
我想在标准输出中创建一个漂亮的 table。 table 有很多 headers 主要是编译时字符串。例如:
std::cout << fmt::format("|{0:-^80}|\n", "File Information");
以上打印:
|-----------------------------File Information------------------------------|
我有很多不同类型的填充和对齐宽度。我决定制作一些辅助函数:
constexpr static
std::string_view
headerCenter(const std::string& text, const int width, const char fill) {
// build fmt string
const std::string_view format = "{:" + 'fill' + '^' + toascii(width) + '}';
return fmt::format(format, text);
}
我在编译时遇到这个错误:
Constexpr function never produces a constant expression
我做错了什么,如何正确做?
格式字符串的类型和函数的return类型不能是string_view
,因为格式字符串是动态构造的,使用string_view
会导致悬空指针。
另外,fmt::format
要求格式字符串必须是常量表达式。相反,您需要使用 fmt::vformat
。这应该有效
static std::string
headerCenter(const std::string& text, const int width, const char fill) {
// build fmt string
std::string format = fmt::format("|{{0:{}^{}}}|", fill, width);
return fmt::vformat(format, fmt::make_format_args(text));
}