我试图包装一个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的话,这是可行的--感觉这应该很容易变成一个参数(虽然我知道它可能不是)?但是,在这里,我能从中受益吗?
发布于 2019-10-10 12:20:52
如果我正确理解..。您希望将格式作为参数传递给编译器,以警告错误的格式.
我看到的唯一方法是将格式作为模板参数传递。
如下所示
#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);
}https://stackoverflow.com/questions/58322123
复制相似问题