Escrevi o seguinte código para usar string em tempo de compilação:
template<char... Chars>
struct CnstString {
template<char... Aped>
using push_back = CnstString<Chars..., Aped...>;
constexpr static char value[] = {Chars...};
};
Tudo bem quando eu uso assim:
#include <iostream>
using str = CnstString<'H', 'e', 'l', 'l', 'o', '\0'>;
int main()
{
std::cout << str << std::endl;
return 0; // it will output "Hello"
}
O que eu quero fazer é usar uma estrutura de modelo recursiva, unir uma string fornecida pelo código acima em tempo de compilação e anexar a à '\0'
matriz no ponto final recursivo.
A razão pela qual escrevi este código é porque quero concatenar a mesma string várias vezes. Obviamente não posso concatenar a mesma string como "Hello""Hello"
.
A estrutura do modelo recursivo é mostrada abaixo:
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'>;
};
No entanto, descobri que não sabia como acrescentar caracteres a si mesmo usando seus caracteres em Str.
Há algo de errado? Ou é simplesmente impossível fazer em tempo de compilação?
Se possível, eu mudaria a definição para
CnstString
colocar '\0' apenas emvalue
Em seguida, forneça
operator +
(o que permitiria a expressão Fold (C++ 17) posteriormente)Finalmente, você
RepeatStr<N, Str>
teria um tipo paraStr{} + .. + Str{}
:Demonstração
Como você está limitado ao C++ 14, substituindo a expressão fold do C++ 17 pela chamada de função "recursiva":
E substitua o template lambda(C++20) pela função de template regular:
Demonstração
Você precisa adicionar a palavra-chave
template
na declaração using para informar ao compilador quepush_back
um modelo é usado.Demonstração de trabalho