我有一个字符串格式化功能,旨在仅接受字符串文字作为格式字符串。我想在编译时计算格式占位符的数量,并且静态断言占位符计数与参数计数匹配。目前,我正在使用宏执行此操作,但它破坏了我需要保留的重载分辨率。
因此,我正在尝试将占位符计数作为非类型模板参数传递给我的格式化函数。
目前,我有这个
template <u32 PlaceholderCount, u32 N, typename... Args>
b32
String_FormatImpl(String& string, const c8 (&format)[N], Args&&... args);
#define String_Format(string, format, ...) \
String_FormatImpl<CountPlaceholders(format)>(string, format, __VA_ARGS__)
但是我正在寻找的东西更像这样
template <int Count>
struct FormatLiteral
{
const char* format;
constexpr FormatLiteral(const char* format)
: format(format)
{}
};
FormatLiteral(const char* format) -> FormatLiteral<CountPlaceholders(format)>;
template <u32 PlaceholderCount, typename... Args>
b32
String_Format(String& string, FormatLiteral<PlaceholderCount> format, Args&&... args);
这可能吗?感觉像constexpr构造函数和模板推导指南可能是可行的途径,但我仍将头放在推导指南上。
这是最小的尝试:https://godbolt.org/z/Sjjtdo