文字使用模板连接

时间:2017-09-22 10:40:14

标签: c++ c++14 metaprogramming

在C #define中,很容易连接两个字符串,例如:
#define PRINT_DBG(_msg_) print("[DBG]" _msg_)

我正在寻找并发现存在这种情况 是否可以在编译时链接这些文字?

 template<typename... Args>
 inline void DBG(conststr fmt, Args... args)
 {
     printf ("[DBG]" fmt,  args ...);
 } 

 template<typename... Args>
 inline void WRN(conststr fmt, Args... args)
 {
     printf (""\e[1;31m" [WRN]" fmt + "\e[0m",  args ...);
 } 

作为第一个arg函数,取const char *。任何的想法?

我也发现了这个实现,但似乎也不起作用。 https://github.com/akrzemi1/static_string

目的:

使用示例。我想让它在编译时工作。现在我为此目的使用makro。

DBG("Some dbg information %s", "23");
WRN("Some wrn information %s", "44");

2 个答案:

答案 0 :(得分:0)

template<typename... Args>
void dbg(const std::string& fmt, Args... args)
{
    using namespace std::string_literals;
    printf ("[DBG]"s + fmt,  args ...);
} 

printf不是constexpr函数,所以在这里想要constexpr是没有意义的,虽然我不完全确定你的意思。

所以简单的答案就是使用标准的std::string连接:重载的+运算符。

答案 1 :(得分:0)

如果您正在使用gcc或clang,也许您可​​以将此gnu扩展名用于模板化用户定义的字符串文字。 clang会警告使用gnu扩展名,但也会生成编译时字符串。

template < class T, T... Chrs>
struct mystring
{   
    static auto c_str()
    {
        static char str[] = {Chrs..., 0}; 
        return str;
    }

    template < T... in> 
    constexpr auto operator+( mystring<T,in...>  )
    {

        return mystring< T, Chrs..., in...>{};
    }
};  




template <class T, T... Chrs>
auto operator""_s()
{   
    return mystring<T, Chrs...>{};
}   

auto x = "That "_s+"is "_s + " my "_s + " string!"_s;


int main()
{   
    std::cout << x.c_str() << std::endl;
}   

可执行文件在其数据部分中包含字符串,因此您可以看到它是在编译时生成的:

[krud @ localhost~] $ objdump -s -j .data go

go:     file format elf64-x86-64

Contents of section .data:
  601050 00000000 00000000 00000000 00000000  ................
  601060 54686174 20697320 206d7920 20737472  That is  my  str
  601070 696e6721 00                          ing!.  "