- Вы пытаетесь присвоить тип не constexpr переменной типа constexpr, что невозможно
constexpr char *var = OBFUSCATED1("Post Malone")
// ^^^ ^^^^^^^^^^^
// type of var is constexpr, return type of OBFUSCATED1 is const char*
Ключевое слово
constexpr
было введено в C ++ 11, поэтому, прежде чем иметь это ключевое слово, вам нужно было написать сложный материал TMP, чтобы компилятор делал вещи во время компиляции.Поскольку TMP завершается, вы теоретически не нуждаетесь в чем-то большем, чем TMP, но, поскольку TMP медленно компилируется и уродлив до готовности, вы можете использовать
constexpr
, чтобы выразить то, что вы хотите оценить во время компиляции, в более удобочитаемом виде.,Хотя между TMP и
constexpr
нет корреляции, это означает, что вы можете использовать
constexpr
без шаблонных классов.
Чтобы достичь желаемого, вы можете сохранить обе версии строки:
template <class T>
constexpr T encrypt(T l, T r)
{
return l ^ r;
}
template <std::size_t S, class U>
struct in;
template <std::size_t S, std::size_t... I>
struct in<S, std::index_sequence<I...>>
{
constexpr in(const char str[S])
: str_{str[I]...}
, enc_{encrypt(str[I], char{0x12})...}
{}
constexpr const char* dec() const
{
return str_;
}
constexpr const char* enc() const
{
return enc_;
}
protected:
char str_[S];
char enc_[S];
};
template <std::size_t S>
class MetaString1
: public in<S, std::make_index_sequence<S - 1>>
{
public:
using base1_t = in<S, std::make_index_sequence<S - 1>>;
using base1_t::base1_t;
constexpr MetaString1(const char str[S])
: base1_t{str}
{}
};
И используйте это так:
int main()
{
constexpr char str[] = "asdffasegeasf";
constexpr MetaString1<sizeof(str)> enc{str};
std::cout << enc.dec() << std::endl;
std::cout << enc.enc() << std::endl;
}