在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");
答案 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!. "