+171
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
#include <iostream>
template <int n>
struct Solution
{
static const int count = Solution<n / 10>::count + 1;
static const int sum = Solution<n / 10>::sum + n % 10;
static const int last = n % 10;
static const int first = Solution<n / 10>::first;
};
#define DECLARE_ONE_DIGIT_SOLUTION(n) template <>\
struct Solution<n>\
{\
static const int count = 1;\
static const int sum = n;\
static const int last = n;\
static const int first = n;\
};
DECLARE_ONE_DIGIT_SOLUTION(0)
DECLARE_ONE_DIGIT_SOLUTION(1)
DECLARE_ONE_DIGIT_SOLUTION(2)
DECLARE_ONE_DIGIT_SOLUTION(3)
DECLARE_ONE_DIGIT_SOLUTION(4)
DECLARE_ONE_DIGIT_SOLUTION(5)
DECLARE_ONE_DIGIT_SOLUTION(6)
DECLARE_ONE_DIGIT_SOLUTION(7)
DECLARE_ONE_DIGIT_SOLUTION(8)
DECLARE_ONE_DIGIT_SOLUTION(9)
int main()
{
const int number = 1024; // <-- то самое число a
std::cout << "Number of digits: " << Solution<number>::count << std::endl;
std::cout << "Sum: " << Solution<number>::sum << std::endl;
std::cout << "Last digit: " << Solution<number>::last << std::endl;
std::cout << "First digit: " << Solution<number>::first << std::endl;
return 0;
}
Это один из ответов к слезной просьбе какого-то школьника (студента) выполнить за него д/з на С++ в разделе development форума на ЛОРе. Такую программу нарочно хрен напишешь.
Само задание: «Дано натуральное число а (a≤100). Напишите программу, определяющую количество цифр в этом числе, сумму его цифр, выводящую на экран первую и последнюю цифру через два пробела».
Запостил:
deniska,
16 Февраля 2011
сначала надо человека сям научить и процедруному подходу
потом грузить неокрепший мозг темплейтами
Кстати, и не школьник это писал -- это ответ на его просьбу. Так что школота в этот раз только свою лень показала.
Вычисления в компайл-тайме - уважаю!
ЗЫ: любопытно, примут ли работу у того школьника?
enum
{
count = Solution<n / 10>::count + 1,
sum = Solution<n / 10>::sum + n % 10,
last = n % 10,
first = Solution<n / 10>::first,
};
компилятор может забить на разворачивание интов и тупо вставить код который их вычисляет...
в гсс с такой проблемой сталкивался сам год назад, в жизни до main были неинициализированные константы...
Не у поминайте её всуе.
приведу псевдокод еще раз
// c1.cpp
const int& some_val_ref = Some_template<param>::value;
// c2.cpp
extern const int& some_val_ref;
некоторый класс в жизни до main обращался к этой переменной и получал в ответ 0, при этом в main этот же код читал правильное значение...
extern const int& use_some;
extern const bool& enable_something;
В стандарте до С++0х не с компилируется.
По крайней мере майкрософсткий компилятор до 2010 студии это делать не будет.
Инициализация статических интегральных типов возможна внутри класса.
Например:
Зато другая и более надёжная половина библиотек использует заместо этого приёма enum.
Конечно, только не во всех компиляторах. Например майкрософстская 2008 студия - сольёт.
работает
И при зависимости от шаблона тоже работает?
int array[Solution<10>::count];
метод с enum лишен этого недостатка...
Интересно, и как STL, а тем более Boost, где такое применяется в шерсть и в гриву, чувствуют себя на таких компиляторах?
Но немалая часть enum употреблена по делу, для перечислений, или в комментариях.
То есть в большинстве случаев может быть: ,а не:
Да что я тут грепом машу -- см. 9.4.2.
Жалко MS VS дома не стоит...
паскалисты верят что именно уголочки делают С++ настолько крутым...
там действительно допустимо превратить код в кусок говна ради скорости
там надо к кристмасу выпустить
только говнокодят обычно в ноч перед дедлайном, а потом живут по принципу "работает - не трогай"...
обидно, что можно жить по другому, но в это мало кто верит...
тоже явно не в коде дело :-D
время программистов дороже времени геймдизайнеров и артистов, поэтому все стараются выносить из кода в данные...
отсюда любовь ко всяким луа, хмл, и тп...
в хорошем энтерпрайзе тоже есть DSL
нужна специализация только для нуля. потом last и надо выкинуть из шаблона first. вместо него ввести степень 10.
Ну и использовать enum вместо static const int не нужно.