У меня есть функция форматирования строки, которая предназначена для приема только строкового литерала в качестве строки форматирования. Я хотел бы подсчитать количество заполнителей формата во время компиляции и статически утверждать, что количество заполнителей соответствует количеству аргументов. В настоящее время я делаю это с помощью макроса, но он нарушает разрешение перегрузки, которое мне нужно сохранить.
Итак, я пытаюсь передать количество заполнителей в качестве параметра шаблона нетипичного типа в мою функцию форматирования,
В настоящее время у меня есть это
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