C++ 是constexpr“;[v[n]]sprintf“;可能的

C++ 是constexpr“;[v[n]]sprintf“;可能的,c++,printf,C++,Printf,我的直觉回答是肯定的,而且实现也可以被“printf”使用。用户定义的类型可能很容易过载 以前有人尝试过这个吗?我相信你做不到-主要问题是如何从函数中得到结果。当您返回一个字符串时,您实际上可以返回(1)一个new-ed缓冲区(或malloced,同样糟糕),(2)一个静态缓冲区或(3)填充其他缓冲区 (1) 这显然是不允许的 (2) 违反sprintf的合同(即非constexprsprintf也不得这样做) (3) 在constexpr中无法分配 如果您只想要“类似于sprintf”的东西,

我的直觉回答是肯定的,而且实现也可以被“printf”使用。用户定义的类型可能很容易过载


以前有人尝试过这个吗?

我相信你做不到-主要问题是如何从函数中得到结果。当您返回一个字符串时,您实际上可以返回(1)一个
new
-ed缓冲区(或
malloc
ed,同样糟糕),(2)一个静态缓冲区或(3)填充其他缓冲区

(1) 这显然是不允许的

(2) 违反
sprintf
的合同(即非
constexpr
sprintf
也不得这样做)

(3) 在
constexpr
中无法分配

如果您只想要“类似于
sprintf
”的东西,而不考虑可能带来的不便,那么像这样的界面就可以:

my_sprintf<my_string<'%', 'd', '%', 'c'>, my_data<int, 42>, my_data<char, 'l'> >::string_value
my_sprintf::string_值

再想一想,您可以避免实际计算字符串,而只存储
sprintf
调用的参数供以后使用。如果用户想要获得一个
char*
,那么他将调用该中间结果的非
constexpr
方法,但是可以通过
constexpr
函数获得单个字符。那将是一个非正统版本的
sprintf
,我不确定它是否算数。

好吧,
constexpr
部分将是
sprintf
,显然,我会更正标题。其余部分将依赖于相同的格式代码。
constepr
对函数体有很多限制。问题是,如何在可变模板中获得
constepr char*
。如果你已经解决了这个问题,这是可能的。您可以做的是在编译时生成一个
putchar
链。我也在寻找相同的解决方案。我相信,如果格式字符串只引用固定长度的数据(static_assert将有帮助),这是可能的。在这种情况下,结果缓冲区长度可以在编译时通过汇总不带占位符的格式字符串长度、每个参数的字符串表示的最大长度以及空终止符的单元格来计算。主要目标是拥有类似std::array buffer的东西_snprint\u f(缓冲区,“%d-0x%p”,一些\u整数,一些\u指针);您甚至可以使用固定长度数据的std::数组作为参数。。。