Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
1

Слияние строк времени компиляции

25.10.2017, 14:22. Просмотров 708. Ответов 3
Метки нет (Все метки)

Добрый день.
Есть строки времени компиляции:

C++
1
2
constexpr const char *str1 = "QWERTY";
constexpr const char *str2 = "q1w2";
Необходимо на этапе компиляции выполнить их слияние:

C++
1
constexpr const char *result = str1 + str2; // Итог: QWERTYq1w2
Как это сделать?

В интернете предлагается использовать класс-обертку вида:

C++
1
2
3
4
5
template<int N>
class ConstString
{
    //...
}
Мне это совершенно не удобно, т.к. всюду придется таскать неизвестное "int N" в сигнатурах функций и параметрах шаблонов.
Например было бы хорошо иметь такую функцию:

C++
1
2
3
4
constexpr const char* concat(const char *str1, const char *str2)
{
    // ...
}
и делать это:

C++
1
2
3
4
5
6
7
constexpr const char* result = concat("ABCD", "q2Sef333"); // #1
 
constexpr const char *str = "QWERTY";
constexpr const char* result = concat(str, "hello"); // #2
 
constexpr const char str[] = "QWERTY";
constexpr const char* result = concat(str, "hello"); // #3
Возможно ли такие или аналогичное?
Пусть будет класс для строки, главное чтобы без шаблонных параметров. Версия C++11/C++14.

Добавлено через 17 часов 45 минут
Никто ничего не знает?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2017, 14:22
Ответы с готовыми решениями:

Полиморфизм времени выполнения/времени компиляции
Здравствуйте, подскажите, пожалуйста, литературу, где мне внятно можно узнать что такое полиморфизм...

Слияние строк
Разработать программу для упрощения работы с путем (Path) к файлу в файловой системе. Привязку к...

Слияние двух строк
Как соединить (конкатенировать) две строки на С? Помогите, пожалуйста

Преобразование int в string и слияние строк
int KeysOfFile+=1; string KeysOfFileS=KeysOfFile; string ...

3
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
25.10.2017, 14:44 2
Compile-time алгоритмы. сборник

Добавлено через 4 минуты
Цитата Сообщение от [progeR] Посмотреть сообщение
главное чтобы без шаблонных параметров
А вот так, боюсь, не выйдет.
0
13529 / 7183 / 1722
Регистрация: 30.01.2014
Сообщений: 12,014
25.10.2017, 19:24 3
Цитата Сообщение от [progeR] Посмотреть сообщение
и делать это:
Прямо вот как у тебя не получится, но можно сделать кое-что наподобие:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
 
template <typename CharT, CharT ...Chars>
struct ct_string
{
    static constexpr char const value[] = { Chars..., 0 };
};
 
template <typename CharT, CharT ...Chars>
constexpr char const ct_string<CharT, Chars...>::value[];
 
template <typename CharType, CharType... Chars>  // <<========= :-)
constexpr auto operator"" _S() 
{
    return ct_string<CharType, Chars...>();
}
 
template<typename CharType, CharType... LeftChars, CharType... RightChars>
constexpr auto operator+(const ct_string<CharType, LeftChars...> &, const ct_string<CharType, RightChars...> &)
{
    return ct_string<CharType, LeftChars..., RightChars...>();
}
 
int main()
{
    constexpr auto result1 = "ABCD"_S + "q2Sef333"_S; // #1
    
    std::cout << result1.value << '\n';
 
    constexpr auto str = "QWERTY"_S;
    constexpr auto result2 = str + "hello"_S; // #2
 
    std::cout << result2.value << '\n';
}
http://rextester.com/DDWW43891

Внимание, в коде используется нестандартное расширение компиляторов gnu (отмечено смайликом): является реализацией этого предложения.
0
2683 / 1855 / 552
Регистрация: 05.06.2014
Сообщений: 5,344
25.10.2017, 19:35 4
Цитата Сообщение от [progeR] Посмотреть сообщение
Как это сделать?
Элементарно.
C++
1
2
3
4
5
6
7
8
#define str1 "1234"
#define str2 "5678"
#define str3 str1 str2
int main()
{
    cout<<str3<<endl;
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2017, 19:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Слияние двух строк с перестановкой символов
Необходимо произвести слияние 2х строк, вводимых в консоль и вывод третьей строки, объединяющей в...

Перегрузка операторов и слияние строк типа char*
Доброго времени суток! Есть класс, для объектов которого перегружен оператор +. Класс представляет...

Измерение времени компиляции
как узнать время компиляции исходного текста и размер памяти, которую програма использует

Динамический двумерный массив строк и операции со строками (поиск, обрезка, слияние)
Создать динамический двумерный массив на 10 ячеек (для десяти строк). Заполнить его строчками...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.