Вывод параметра шаблона из параметра конструктора constexpr - PullRequest
0 голосов
/ 22 октября 2019

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

Итак, я пытаюсь передать количество заполнителей в качестве параметра шаблона нетипичного типа в мою функцию форматирования,

В настоящее время у меня есть это

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

...