Как удалить строку, заданную как const char[] с помощью функции constexpr?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как удалить строку, заданную как const char[] с помощью функции constexpr?

Сообщение Anonymous »

Я хочу определить функцию constexpr Strip_string, которая позволяет:
  • Обрезать строку (удаление смежных пробелов в начале и конце строки). строку.
  • Нормализовать смежные пробелы в середине строки до одного пробела.
  • Вернуть константный символ* финального значения size как константа, поэтому двоичный файл будет содержать сокращенную строку, а не исходную строку.
Цель состоит в том, чтобы сохранить читаемую строку в источнике и иметь самая короткая строка в двоичном формате.
Я использую Visual Studio C++ 2017.
В качестве примера:
Я хочу, чтобы это было в моем исходном коде (и только в моем исходном коде, а не в моем двоичном файле!):

Код: Выделить всё

R"SQL("

CREATE TABLE IF NOT EXISTS "MyTable" (
"ID"                    INTEGER NOT NULL,
"Field1"                TEXT NOT NULL,
"Field2"                TEXT,
PRIMARY KEY("ID")
)

)SQL"
И только это в моем двоичном файле (без исходной строки!):

Код: Выделить всё

CREATE TABLE IF NOT EXISTS "MyTable" ( "ID" INTEGER NOT NULL, "Field1" TEXT NOT NULL, "Field2" TEXT, PRIMARY KEY("ID"))
И вот последняя попытка кода, которая все еще показывает использование constexpr перед каждой функцией, недостаточно, чтобы превратить их в настоящие константы:

Код: Выделить всё

#include 
#include 
#include 

constexpr bool is_whitespace(char c) {
return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == '\v';
}

template
constexpr std::size_t calculate_final_length(const char (&input)[N]) {
std::size_t start = 0;
std::size_t end = N - 1;

while (start < end && is_whitespace(input[start])) {
++start;
}

while (end > start && is_whitespace(input[end - 1])) {
--end;
}

std::size_t trimmed_length = end - start;

std::size_t final_length = 0;
bool in_whitespace = false;

for (std::size_t i = 0; i < trimmed_length; ++i) {
char c = input[start + i];
if (is_whitespace(c)) {
if (!in_whitespace) {
++final_length;
in_whitespace = true;
}
} else {
++final_length;
in_whitespace = false;
}
}

return final_length;
}

template
constexpr auto strip_string(const char (&input)[N]) {
constexpr std::size_t final_length = calculate_final_length(input); // Fails to turn it into constant

char result[final_length + 1] = {};
std::size_t out_index = 0;
bool in_whitespace = false;

// Calculer les indices de début et de fin après suppression des blancs
std::size_t start = 0;
std::size_t end = N - 1;

while (start < end && is_whitespace(input[start])) {
++start;
}

while (end > start && is_whitespace(input[end - 1])) {
--end;
}

// Calculer la longueur après trim
std::size_t trimmed_length = end - start;

// Remplir le tableau résultant avec les caractères traités
for (std::size_t i = 0; i < trimmed_length; ++i) {
char c = input[start + i];
if (is_whitespace(c)) {
if (!in_whitespace) {
result[out_index++] = ' ';
in_whitespace = true;
}
} else {
result[out_index++] = c;
in_whitespace = false;
}
}

result[out_index] = '\0';

return result;
}

constexpr const char raw_string[] = ;
constexpr auto test = strip_string(
R"(   This is     a  RAW string     test   )");

int main() {
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78543630/how-to-strip-a-string-given-as-a-const-char-through-a-constexpr-function[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»