#include <stdio.h> int index = 0; struct A { A() { printf( "%d ", ++index); } }; int main( ) { A a[1000]; return 0; }
Бунтарчик
> Можно также создать N объектов
что-то типа
struct foo { static int i; foo() { printf( "%d\n", i++); } }; int main( ) { Foo *f = new Foo[42]; }
?
мне как-то сразу в голову не пришло, трудно придумать решение в течение 20-30 секунд, если не знать его заранее.
upd.
опередил :)
Бунтарчик
> Можно также создать N объектов,
тока тут будет цикл, внутри рантайма
cNoNim
> тока тут будет цикл, внутри рантайма
Такой же цикл, как твой goto.
template <int A> struct Printer { static void Print() { Printer<A - 1>::Print( ); printf( "%d ", A); } }; template <> struct Printer<0> { static void Print( ) {} }; ... Printer<100>::Print( );
Бунтарчик
> Такой же цикл, как твой goto.
в моем goto используется костыль ввиде целочисленного деления,
а вот как реализована инициализация массивов я не совсем в курсе, возможно там простой цикл с условием, что не попадает под условия
Вариант PANDA пока по-моему лучший. Если (как это сделали на SO) придраться к тому что условные операторы есть в компиляторе, то ведь остальной код тоже требует компиляции, так что тогда только готовый бинарник прокатит.
Бунтарчик
> Спрашивать о тонкостях стандартной библиотеки - это значит вы хотите нанять
> словарь. Программист должен уметь пользоваться документацией и не обязан знать
> её наизусть.
Примерно такие вопросы мне задавали в сраном яндексе. Реально, чувак спрашивал как называется метод закрытия коннекций в Apache HTTP Client и какое полное имя пакаджа.
PANDA
Существует ограничение на количество вложенных вызовов шаблонов. В gcc по умолчанию вроде бы 500. Если сильно превысить, то можно нарваться на бесконечный спам сообщениями об ошибках в консоль.
#include <stdio.h> int i = 0; void f1() {printf( "%d\n", ++i);} void f2( ) {f1( );f1( );} void f4( ) {f2( );f2( );} void f8( ) {f4( );f4( );} void f16( ) {f8( );f8( );} void f32( ) {f16( );f16( );} void f64( ) {f32( );f32( );} void f128( ) {f64( );f64( );} void f256( ) {f128( );f128( );} void f512( ) {f256( );f256( );} int main( ) { f512( ); f256( ); f128( ); f64( ); f32( ); f8( ); return 0; }
Zefick
У тебя не универсальное, задача то не до 1000 как на SO, а до N.
kipar
Решения времени компмляции все не универсальные
Можно также через наследование. Два указателя на 2 класса с общим родителем, один делает рекурсивный вызов функции, другой ничего не делает. Меняем индекс когда доходит до N.
По сути это как с указателями на функции, но через классы с наследованием.
kipar
> У тебя не универсальное, задача то не до 1000 как на SO, а до N.
Ваще изи:
#include <stdio.h> int i = 0; void f0() {} void f1( ) {printf( "%d\n", ++i);} void f2( ) {f1( );f1( );} void f4( ) {f2( );f2( );} void f8( ) {f4( );f4( );} void f16( ) {f8( );f8( );} void f32( ) {f16( );f16( );} void f64( ) {f32( );f32( );} void f128( ) {f64( );f64( );} void f256( ) {f128( );f128( );} void f512( ) {f256( );f256( );} void ( *( fs[]))( ) = {f0, f1, f2, f4, f8, f16, f32, f64, f128, f256, f512}; int main( ) { int n = 1000; fs[( ( n >> 9) & 1) * 10]( ); fs[( ( n >> 8) & 1) * 9]( ); fs[( ( n >> 7) & 1) * 8]( ); fs[( ( n >> 6) & 1) * 7]( ); fs[( ( n >> 5) & 1) * 6]( ); fs[( ( n >> 4) & 1) * 5]( ); fs[( ( n >> 3) & 1) * 4]( ); fs[( ( n >> 2) & 1) * 3]( ); fs[( ( n >> 1) & 1) * 2]( ); fs[( ( n >> 0) & 1) * 1]( ); return 0; }
Zefick
> Существует ограничение на количество вложенных вызовов шаблонов. В gcc по
> умолчанию вроде бы 500. Если сильно превысить, то можно нарваться на
> бесконечный спам сообщениями об ошибках в консоль.
Там все даже хуже на самом деле. Эту переменную можно менять специальной опцией. Но компилятор жрет очень много памяти (тестил года 3 назад), когда огромная вложенность. И у меня в каком-то похожем коде получалось, что компайлер откладывал многое в рантайм. Но я много не тестил, асм не смотрел, просто заметил, что тормозит. Ясное дело, что это говнокод, но это чисто как решение задачки. Мне лично больше нравится с целочисленным делением, хорошая идея.
9К720
> Штука баксов это средняя зарплата для большинства московских программистов. Мы
> в соседнем треде выяснили.
Ммм, не знал. Как мир-то меняется быстро.
Тема в архиве.