И всё таки: берём boost::mpl::string (можно сделать собственную, упрощённую реализацию; также boost::mpl::push_front, boost::mpl::c_str, boost::mpl::empty) и boost::mpl::if_ (элементарно делается):
Здравствуйте, ankorol, Вы писали:
A>Можно ли как-то преобразовать целое в строку во время компиляции?...
Азарт разыгрался, захотелось решить задачку без сторонних библиотек. В этой версии отбрасываются незначащие нулевые разряды и правильно обрабатываются отрицательные числа и нуль. Реализация, конечно, несколько сложнее, чем здесь
enum Signs { negative, positive };
template<int n> struct Abs { static const unsigned value = n < 0 ? -n : n; };
template<int n> struct Sign { static const Signs value = n < 0 ? negative : positive; };
template<unsigned n> struct DigitsCount { enum { value = DigitsCount<n/10>::value + 1 }; };
template<> struct DigitsCount<0> { enum { value = 0 }; };
template<unsigned n, int pos, bool outOfRange> struct CheckedLittleEndianSymbolAt { static const char value = 0; };
template<unsigned n, int pos> struct CheckedLittleEndianSymbolAt<n, pos, false>
{ static const char value = CheckedLittleEndianSymbolAt<n / 10, pos - 1, false>::value; };
template<unsigned n> struct CheckedLittleEndianSymbolAt<n, 0, false> { static const char value = '0' + n%10; };
template<unsigned n, int pos> struct LittleEndianSymbolAt : CheckedLittleEndianSymbolAt<n, pos, pos < 0> { };
template<Signs sign, unsigned absValue, int pos> struct SymbolOfSignedAt;
template<unsigned n, int pos> struct SymbolOfSignedAt<negative, n, pos> : SymbolOfSignedAt<positive, n, pos - 1> { };
template<unsigned n> struct SymbolOfSignedAt<negative, n, 0> { static const char value = '-'; };
template<unsigned n, int pos> struct SymbolOfSignedAt<positive, n, pos> : LittleEndianSymbolAt<n, DigitsCount<n>::value-pos-1> { };
template<> struct SymbolOfSignedAt<positive, 0, 0> { static const char value = '0'; };
template<int n, int pos> struct SymbolAt : SymbolOfSignedAt<Sign<n>::value, Abs<n>::value, pos> { };
template<int n> struct IntToString { static const char value[]; };
template<int n> const char IntToString<n>::value[] =
{
SymbolAt<n,0>::value, SymbolAt<n,1>::value, SymbolAt<n,2>::value, SymbolAt<n,3>::value,
SymbolAt<n,4>::value, SymbolAt<n,5>::value, SymbolAt<n,6>::value, SymbolAt<n,7>::value,
SymbolAt<n,8>::value, SymbolAt<n,9>::value, SymbolAt<n,10>::value, SymbolAt<n,12>::value,
};
Теперь нужно убедиться, что мы получаем эти строки именно во время компиляции. Для этого достаточно проверить, что мы можем этими строковыми значениями параметризовать шаблоны:
Здравствуйте, ankorol, Вы писали:
A>Здравствуйте, rg45, Вы писали:
R>>Не получится потому, что директивы #pragma обрабатываются еще до компиляции препроцессором.
A>Ваша правда, так не получится, а если чисто теоретически такое преобразование можно сделать?
Упрощенно, для иллюстрации идеи, ниже показано как это можно реализовать. Если сделать еще пару-тройку танцевальных движений с бубном, то можно обобщить реализацию на целочисленный тип произвольного размера и убрать не значашие нули в начале строки.
ТКС>Ну а что мешает в рантайме ее заполнить? A>Ничто не мешает, это просто я себе придумал такое упражнение-извращение с шаблонами, ничего общего с реальной жизнью это не имеет.
Вы уверены, что себе?
R>>Не получится потому, что директивы #pragma обрабатываются еще до компиляции препроцессором. A>Ваша правда, так не получится, а если чисто теоретически такое преобразование можно сделать?
Здравствуйте, ankorol, Вы писали:
R>>Не получится потому, что директивы #pragma обрабатываются еще до компиляции препроцессором.
A>Ваша правда, так не получится, а если чисто теоретически такое преобразование можно сделать?
Теоретически можно например во время компиляции заполнить статический массив char строкой, содержащей текстовое представление числовой константы времени компиляции. Практически это будет жутко замедлять компиляцию и вообще кажется смысла не имеет.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Тот кто сидит в пруду, Вы писали:
ТКС>Теоретически можно например во время компиляции заполнить статический массив char строкой, содержащей текстовое представление числовой константы времени компиляции. Практически это будет жутко замедлять компиляцию и вообще кажется смысла не имеет.
А можно пример кода.
Ну приминение можно придумать — например я хочу иметь для своей специализации шаблона
Здравствуйте, ankorol, Вы писали:
ТКС>>Теоретически можно например во время компиляции заполнить статический массив char строкой, содержащей текстовое представление числовой константы времени компиляции. Практически это будет жутко замедлять компиляцию и вообще кажется смысла не имеет.
A>А можно пример кода.
Давайте так: вы напишете 2 рекурсивную функция которая вычисляет n-й символ в строковом представлении целого числа, если n превышает длину строки — возвращает 0. А я ваш код в компайлтайм переведу
A>Ну приминение можно придумать — например я хочу иметь для своей специализации шаблона A>
A>template<int N>
A>{
A> static char *str_presentation;
A>}
A>
A>в str_presentation значени N что бы во время вывода на экран или еще куда-то время на перевод числа в строку.
Ну а что мешает в рантайме ее заполнить?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Спасибо! Супер! Мне нехватало этого шага с инициализацией строки символами через запятую, всё пытался конкатенировать строки. Танцевальные движения с бубном попробую сам придумать.
Здравствуйте, ankorol, Вы писали:
R>>Не получится потому, что директивы #pragma обрабатываются еще до компиляции препроцессором.
A>Ваша правда, так не получится, а если чисто теоретически такое преобразование можно сделать?
С точки зрения теории, по идее, нельзя.
Шаблоны допускает инициализацию только интегральных типов, куда ни string, ни char* не попадают.
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
ТКС>Давайте так: вы напишете 2 рекурсивную функция которая вычисляет n-й символ в строковом представлении целого числа, если n превышает длину строки — возвращает 0. А я ваш код в компайлтайм переведу
rg45 уже написал не рекурсивную версию.
ТКС>Ну а что мешает в рантайме ее заполнить?
Ничто не мешает, это просто я себе придумал такое упражнение-извращение с шаблонами, ничего общего с реальной жизнью это не имеет.
Здравствуйте, ankorol, Вы писали:
A>Спасибо! Супер! Мне нехватало этого шага с инициализацией строки символами через запятую, всё пытался конкатенировать строки. Танцевальные движения с бубном попробую сам придумать.
Интересно будет посмотреть конечную реализацию.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, ankorol, Вы писали:
ТКС>>Давайте так: вы напишете 2 рекурсивную функция которая вычисляет n-й символ в строковом представлении целого числа, если n превышает длину строки — возвращает 0. А я ваш код в компайлтайм переведу
A>rg45 уже написал не рекурсивную версию.
Exp10 у него, естественно, рекурсивная. Не рекурсивно такие вещи на шаблонах не делаются.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Тот кто сидит в пруду, Вы писали:
ТКС>Exp10 у него, естественно, рекурсивная. Не рекурсивно такие вещи на шаблонах не делаются.
Ну это вспомогательный класс. Его тоже можно заполнить специализациями вручную до каких-то разумных приделов.
Но согласен очень много чего в метапрограммировании на С++ рекурсивное...
Здравствуйте, ankorol, Вы писали:
ТКС>>Exp10 у него, естественно, рекурсивная. Не рекурсивно такие вещи на шаблонах не делаются. A>Ну это вспомогательный класс. Его тоже можно заполнить специализациями вручную до каких-то разумных приделов.
С тем же успехом можно и все нужные строки специализациями задать.
A>Но согласен очень много чего в метапрограммировании на С++ рекурсивное...
Вообще-то ни много, ни мало, а любые вычисления во время компиляции Просто других средств для вычислений нету — только рекурсия для повторения и специализация для ветвления. Дальше можно уже как в MPL через них выражать другие сущности.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, ankorol, Вы писали:
A>Здравствуйте, Alexey F, Вы писали:
АF>>Может, int на unsigned сменить?
A>Да, надо бы сменить... или допилять что-бы отрицательные корректно обрабатывались
Здравствуйте, ankorol, Вы писали:
A>Спасибо! Супер! Мне нехватало этого шага с инициализацией строки символами через запятую, всё пытался конкатенировать строки. Танцевальные движения с бубном попробую сам придумать.
А это разве получится в #pragma message запихнуть?