我编写了以下在编译时使用字符串的代码:
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"
}
我想要做的是使用递归模板结构体,在编译时拼接上面代码给出的字符串,并将 a 追加'\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:: template push_back<'\0'>;
};
但是,我发现我不知道如何使用 Str 中的字符向自身追加字符。
有什么不对?或者在编译时根本不可能做到?
如果可能的话,我会更改 的定义,
CnstString
仅将 '\0' 放置在value
然后提供
operator +
(稍后将允许 Fold 表达式 (C++17))最后,您
RepeatStr<N, Str>
将有一个类型Str{} + .. + Str{}
:演示
由于您仅限于 C++14,因此用“递归”函数调用替换 C++17 的折叠表达式:
并将模板 lambda(C++20) 替换为常规模板函数:
演示
您需要在 using 声明中添加关键字
template
来告诉编译器push_back
正在使用模板。工作演示