Информация об изменениях

Сообщение Re[3]: Что такое Dynamically-sized types (DSTs) в Rust ? от 12.01.2015 10:54

Изменено 02.02.2015 20:04 night beast

Здравствуйте, x-code, Вы писали:

XC>ОК, то есть если тип динамический (точно известен лишь в рантайме — в частности указатель на базовый класс) то и размер динамический — это понятно. Ну а фича-то в чем? Как в С++ жили без этого и почему в Rust это вдруг понадобилось?


ну это и в сях может понадобиться:
struct test {
    virtual ~test () {}
    virtual void foo () = 0;
};

struct test1 : test {
    virtual void foo () {}
};

struct test2 : test {
    virtual void foo () {}
};

struct test_factory {
    virtual int capacity ( ) = 0;
    virtual test * create ( char * buffer ) = 0;
};

template< typename Test >
struct test_factory_impl : test_factory {
    virtual int capacity ( ) { return sizeof( Test ) + 4; }
    virtual test * create ( char * buffer ) { return new(buffer) Test(); }
};

test_factory * foo ( ) {
    if ( rand() % 2 ) {
        static test_factory_impl< test1 > f1;
        return &f1;
    } else {
        static test_factory_impl< test2 > f2;
        return &f2;
    }
}

int main () {
    for ( int i = 0; i < 2; ++i ) {
        test_factory * f = foo ( );
        test * t = f->create( alloca( f->size( ) ) );
        t->foo( );
    }
}


не знаю, как проще написать. здесь присутствуют очевидные ограничения.
если в Rust что-то сделали что-то такое, то это неплохо.
Re[3]: Что такое Dynamically-sized types (DSTs) в Rust ?
Здравствуйте, x-code, Вы писали:

XC>ОК, то есть если тип динамический (точно известен лишь в рантайме — в частности указатель на базовый класс) то и размер динамический — это понятно. Ну а фича-то в чем? Как в С++ жили без этого и почему в Rust это вдруг понадобилось?


ну это и в сях может понадобиться:
struct test {
    virtual ~test () {}
    virtual void foo () = 0;
};

struct test1 : test {
    virtual void foo () {}
};

struct test2 : test {
    virtual void foo () {}
};

struct test_factory {
    virtual int capacity ( ) = 0;
    virtual test * create ( char * buffer ) = 0;
};

template< typename Test >
struct test_factory_impl : test_factory {
    virtual int capacity ( ) { return sizeof( Test ) + 4; }
    virtual test * create ( char * buffer ) { return new(buffer) Test(); }
};

test_factory * foo ( ) {
    if ( rand() % 2 ) {
        static test_factory_impl< test1 > f1;
        return &f1;
    } else {
        static test_factory_impl< test2 > f2;
        return &f2;
    }
}

int main () {
    for ( int i = 0; i < 2; ++i ) {
        test_factory * f = foo ( );
        local_ptr<test> t = f->create( alloca( f->size( ) ) );
        t->foo( );
    }
}


не знаю, как проще написать. здесь присутствуют очевидные ограничения.
если в Rust что-то сделали что-то такое, то это неплохо.