将constexpr const char *传递给模板函数?

时间:2019-10-10 11:42:47

标签: c++ printf c++17 constexpr

我正在尝试包装类似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 :(得分: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);
 }