Вот мой код:
#include <string.h>
#include <stdlib.h>
template <int ...I>
class MetaString
{
char buffer_[sizeof...(I)+1];
public:
// A constexpr constructor
constexpr MetaString(const char * arg) :buffer_{ encrypt(arg[I])... }
{}
constexpr const char *get()const { return buffer_; }
private:
constexpr char encrypt(const char c) const { return c ^ 0x55; }
};
char *decrypt(const char* buffer_, int size)
{
char* tmp = (char *)malloc(size + 1);
strcpy_s(tmp, size + 10, buffer_);
for (int i = 0; i < size; i++)
{
*(tmp + i) = *(tmp + i) ^ 0x55;
}
return tmp;
}
int main()
{
constexpr MetaString<0,1,2,3,5> var("Post Malone");
char * var1 = decrypt(var.get(), 5);
std::cout << var1 << std::endl;
return 1;
}
Идея проста, я создаю объект MetaString
и предоставляю ему string
. Конструктор шифрует аргумент XOR
. Тогда у меня есть decrypt
функция, которая расшифровывает значение обратно.
Проблема в том, что я устанавливаю точку останова в конструкторе (в частности, в этой строке constexpr MetaString(const char * arg) :buffer_{ encrypt(arg[I])... }
), и она срабатывает, когда я запускаю в режиме отладки. Что, как я понимаю, означает, что конструктор вызывается во время выполнения.
Чтобы гарантировать, что функции будут оцениваться во время компиляции, я создал объект таким образом constexpr MetaString<0,1,2,3,5> var("Post Malone");
Но я читал, что переменная constexpr
должна быть литерального типа.
Итак, мой вопрос: как мне получить переменную типа var
(в которой были бы зашифрованные данные и которая была бы оценена во время компиляции), а затем вызвать decrypt
во время выполнения и получить исходное значение?