Шифрование времени компиляции для строк с использованием пользовательских литералов
Мне известно, что новый стандарт C++ допускает использование пользовательских литералов и что их генерация может выполняться во время компиляции.
Тем не менее, я совершенно новичок во всей вселенной шаблонного метапрограммирования и пытаюсь привести некоторые примеры в жизнь, но все же безуспешно, так как я впервые сталкиваюсь с этой конкретной функцией.
Допустим, у меня есть строка:
std::string tmp = "This is a test message";
И я хотел бы зашифровать его во время компиляции, используя:
std::string tmp = "This is a test message"_encrypt;
Возможно ли даже то, что я пытаюсь сделать?
В настоящее время я использую VS2015, поэтому любая помощь или отзывы приветствуются.
1 ответ
Возможно ли даже то, что я пытаюсь сделать?
Да, это возможно*. То, что вы можете предварительно вычислить и поместить непосредственно в исходный код, также может быть выполнено компилятором во время компиляции.
Тем не менее, вы не можете использовать std::string
, Это не буквальный тип. Что-то вроде:
constexpr std::string tmp = "some string literal"
никогда не будет компилироваться, потому что std::string
а также std::basic_string
в общем нет constexpr
конструктор.
Поэтому вы должны использовать const char []
как вход для вашего метапрограммирования; после этого вы можете назначить его std::string
,
NB. Мета-программирование имеет некоторые ограничения, которые необходимо учитывать: у вас нет доступа ко многим инструментам, которые вы могли бы иметь, например, new
или же malloc
Например: вы должны разместить в стеке свои переменные.
* Edit: не совсем с UDL, как указывает @ms. Действительно, вы получаете указатель на const char
s и длина строки. Это довольно ограничительно в constexpr
сценарий, и я сомневаюсь, что можно найти способ работать над этой строкой. В "нормальном" метапрограммировании, где вы можете иметь размер, который является постоянным выражением, вместо этого возможно шифрование во время компиляции.