首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将const char*传递给模板函数?

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

Stack Overflow用户
提问于 2019-10-10 11:42:47
回答 1查看 333关注 0票数 2

我试图包装一个printf类函数,同时保留对无效格式的警告(MSVC不允许将其扩展到您自己的printf函数..)。

这里的例子:

https://godbolt.org/z/na_JOe

代码语言:javascript
复制
#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;
}

上面的代码工作正常(按其应有的方式触发警告)。

但是,的问题是使格式字符串成为参数,同时保留无效的格式警告

以下天真方法的语法无效:

代码语言:javascript
复制
template<typename... Args>
void test_tpl(constexpr const char* format, Args&&... args) {

现在,如果字符串是constexpr的话,这是可行的--感觉这应该很容易变成一个参数(虽然我知道它可能不是)?但是,在这里,我能从中受益吗?

EN

回答 1

Stack Overflow用户

发布于 2019-10-10 12:20:52

如果我正确理解..。您希望将格式作为参数传递给编译器,以警告错误的格式.

我看到的唯一方法是将格式作为模板参数传递。

如下所示

代码语言:javascript
复制
#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);
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58322123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档