Передача constexpr const char * в функцию шаблона? - PullRequest
2 голосов
/ 10 октября 2019

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

Пример здесь:

https://godbolt.org/z/na_JOe

#include <string>
#include <utility>

#include <stdio.h>

#pragma warning(error : 4477)


constexpr const char* t = "%s";

template<typename... Args>
void test_tpl(Args&&... args) {

        constexpr size_t optimistic_buffer_size = 1024;
        static thread_local char optimistic_buffer[optimistic_buffer_size];

        int ret_count = _snprintf(optimistic_buffer, optimistic_buffer_size, t, std::forward<Args>(args)...);

}



int main() {
    std::string hello;
    test_tpl(hello);
    return 0;
}

Приведенный выше код работает (выдает предупреждение, как и должно).

Однако проблема заключается в том, чтобы сделать строку формата параметром при сохранениипредупреждение о недопустимом формате

Следующий наивный неправильный синтаксис:

template<typename... Args>
void test_tpl(constexpr const char* format, Args&&... args) {

Теперь это работает, если строка является constexpr - выглядит как это должно быть достаточно легко превратить в параметр (хотя я знаю, что это может быть не так)? но есть ли здесь какой-то простой способ или хитрость, из которых я могу извлечь выгоду?

1 Ответ

0 голосов
/ 10 октября 2019

Если я правильно понимаю ... вы хотите передать формат в качестве аргумента, поддерживающего предупреждение компилятора о неправильном формате ...

Единственный способ, которым я вижу, - передать формат в качестве параметра шаблона.

Что-то следующее

#include <string>
#include <utility>

#include <cstdio>

constexpr char const t[] = "%s";

template <char const * frmt, typename ... Args>
void test_tpl (Args && ... args)
 {
   constexpr size_t optimistic_buffer_size = 1024;
   static char optimistic_buffer[optimistic_buffer_size];

   snprintf(optimistic_buffer, optimistic_buffer_size, frmt,
            std::forward<Args>(args)...);
 }

int main ()
 {
   std::string hello;

   test_tpl<t>(hello);
 }
...