Шифрование времени компиляции для строк с использованием пользовательских литералов

Мне известно, что новый стандарт 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 chars и длина строки. Это довольно ограничительно в constexpr сценарий, и я сомневаюсь, что можно найти способ работать над этой строкой. В "нормальном" метапрограммировании, где вы можете иметь размер, который является постоянным выражением, вместо этого возможно шифрование во время компиляции.

Другие вопросы по тегам