如何在编译时重复连接字符串?

问题描述 投票:0回答:1

我编写了以下代码以在编译时使用字符串:

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中的字符向自身追加字符。

有什么问题吗?或者它根本不可能在编译时完成?

c++ string templates c++14 template-meta-programming
1个回答
0
投票

您需要在 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'>;    
};

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.