我正在尝试包装类似printf的函数,同时保留关于无效格式的警告(MSVC不允许将其扩展到您自己的printf函数。)。
此处示例:
#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,则此方法有效-它感觉像那样应该足够容易地转换为参数(尽管我可能并不知道)?但是我可以从中受益吗?
答案 0 :(得分:0)
如果我正确理解...,您想将格式作为参数传递,以使编译器警告有关错误格式的信息...
我看到的唯一方法是将格式作为模板参数传递。
以下内容
#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);
}