我编写了以下代码以在编译时使用字符串:
template<char... Chars>
struct CnstString {
template<char... Aped>
using push_back = CnstString<Chars..., Aped...>;
constexpr static char value[] = {Chars...};
};
我这样使用就可以了:
#include <iostream>
using str = CnstString<'H', 'e', 'l', 'l', 'o', '\0'>;
int main()
{
std::cout << str << std::endl;
return 0; // it will output "Hello"
}
我想做的是使用递归模板结构体,在编译时拼接上面代码给出的字符串,并在递归终点处向数组追加一个
'\0'
。
我写这段代码的原因是因为我想多次连接同一个字符串。显然我不能像
"Hello""Hello"
那样将相同的字符串连接在一起。
递归模板结构如下所示:
template<int N, typename Str>
struct RepeatStr {
using ret = RepeatStr<N-1, Str>; // this is an error, I don't know how to pass parameters
};
template<typename Str>
struct RepeatStr<-1, Str> {
using ret = Str::push_back<'\0'>;
};
但是,我发现我不知道如何使用Str中的字符向自身追加字符。
有什么问题吗?或者它根本不可能在编译时完成?
您需要在 using 声明中添加关键字
template
来告诉编译器 push_back
使用模板。
template<int N, typename Str>
struct RepeatStr {
using ret = RepeatStr<N-1, Str>;
};
template<typename Str>
struct RepeatStr<-1, Str> {
//--------------------vvvvvvvv------------------->works now
using ret = Str:: template push_back<'\0'>;
};