constexpr "[v[n]]sprintf"可能吗?

Is constexpr "[v[n]]sprintf" possible?

本文关键字:sprintf constexpr      更新时间:2023-10-16

我的直觉答案是肯定的,"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调用的参数以供以后使用。然后,如果用户想要获得一个char*,他将调用该中间结果的非constexpr方法,但是单个字符可以通过constexpr函数获得。那将是sprintf的非正统版本,我不确定它是否算数。