gpt4 book ai didi

c++ - 是否有任何类型安全的、编译时检查的 printf 的实现?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:35 30 4
gpt4 key购买 nike

我看到很多类型安全的 printf 实现,但大多数都是使用异常来引发类型错误。

作为练习,我使用字符串文字实现了类似 printf 格式的原型(prototype),它似乎解决了旧的、好的 printf 系列的所有问题(除了使用从外部源读取的格式,这总是不安全的)。

示例:

int main(int argc, char* argv[])
{
std::cout << "const char*: %s, std::string: %s\n"_format("ONE", std::string{"TWO"});
std::cout << "user defined: %*\n"_format(std::complex<int>{1, 2});
std::cout << "hex: 0x%x, int: %d\n"_format(16, 123);
std::cout << "double.2: %.2f, double: %f\n"_format(13.123123, 12.1);

std::string s = "p(%d, %d)\n"_format(123, 234);
std::cout << s;

// not yet working
// int x, y;
// std::cin >> "p(%d, %d)"_format(x, y);
// "p(%d, %d)"_format(x, y) = "p(999, 888)";
}

完整的、脏的、不完整的、也没有优化的代码是 here

生成的 .s 表明在运行时没有进行任何文本处理,即使变量不是 const,而是取自 argv 的例子.传递错误的变量类型或使用参数计数会导致丑陋的编译错误,这可以通过静态断言或概念来改善。

这只是练习,问题是:是否有任何库支持这种构造,为什么这种方法不是 c++ 标准的一部分?

最佳答案

{fmt} library和 C++20 std::format有编译时格式字符串检查。例如 ( https://godbolt.org/z/vr57bqzb3 ):

#include <fmt/core.h>

int main() {
std::string s = fmt::format("{:d}", "I am not a number");
}

给出编译时错误,因为 d 是字符串的无效格式说明符。这使用类似 Python 的格式字符串语法,而不是 printf 语法。

关于c++ - 是否有任何类型安全的、编译时检查的 printf 的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47199389/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com