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