Здравствуйте, 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 что-то сделали что-то такое, то это неплохо.