我的直观答案是肯定的,并且“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
再三考虑,您可以避免实际计算字符串,而只存储sprintf
调用的参数以供以后使用。然后,如果用户想要获得 ,则用户将调用constexpr
该中间结果的非方法char*
,但可以通过constexpr
函数获得单个字符。那将是一个非正统的版本sprintf
,我不确定它是否会算在内。