Boost logo

Boost :

From: Vaclav Vesely (vaclav.vesely_at_[hidden])
Date: 2006-10-06 04:20:32


Hi,

I would like to do somethink like this:

    class Base {...}
    class Derived: public Base {...}

    optional<Base> x = Derived();
    y->call_virtual_functions()

Current design of boost::optional doesn'g support this. But I wonder if it's
to possible to extend it.

I created simple prototype to verify the technique (see attachment). It
works this way:

optional<BaseT>
- has attribut _value_holder of type value_holder<BaseT>*
- _value_holder points to the instance of derived_value_holder<BaseT,
DerivedT>, where DerivedT is the type of stored value

value_holder<BaseT>
- abstract class
- can be cloned (deep copy)

derived_value_holder<BaseT, DerivedT>
- is derived from value_holder<BaseT>
- contains DerivedT value (cloned with copy constructor)

What do you think about it?

Regards,
Vaclav

begin 666 optional_test.cpp
M(VEN8VQU9&4@/&EO<W1R96%M/@T*#0IU<VEN9R!N86UE<W!A8V4@<W1D.PT*
M#0HO+RTM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM#0H-"F-L87-S
M($$-"GL-"G!U8FQI8SH-"B @("!V:7)T=6%L('9O:60@=&5S="@I(&-O;G-T
M#0H@(" @>PT*(" @(" @("!C;W5T(#P\(")!(B \/"!E;F1L.PT*(" @('T-
M"GT[#0H-"F-L87-S($(Z#0H@(" @<'5B;&EC($$-"GL-"G!U8FQI8SH-"B @
M("!V:7)T=6%L('9O:60@=&5S="@I(&-O;G-T#0H@(" @>PT*(" @(" @("!C
M;W5T(#P\(")"(B \/"!E;F1L.PT*(" @('T-"GT[#0H-"B\O+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2T-"B\O(%9A;'5E(&AO;&1E<B!B87-E
M(&9O<B!V86QU97,@9&5R:79E9"!F<F]M($)A<V54#0H-"G1E;7!L871E/'1Y
M<&5N86UE($)A<V54/@T*8VQA<W,@=F%L=65?:&]L9&5R#0I[#0IP=6)L:6,Z
M#0H@(" @=FER='5A;"!^=F%L=65?:&]L9&5R*"D@>WT[#0H@(" @=FER='5A
M;"!"87-E5"H_at_9V5T*"D@/2 P.PT*(" @('9I<G1U86P@=F%L=65?:&]L9&5R
M*B!C;&]N92_at_I(&-O;G-T(#T@,#L-"GT[#0H-"B\O+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2T-"B\O(%9A;'5E(&AO;&1E<B!F;W(@=F%L=65S
M(&]F('1Y<&4_at_1&5R:79E9%0_at_9&5R:79E9"!F<F]M($)A<V54#0H-"G1E;7!L
M871E/'1Y<&5N86UE($)A<V54+"!T>7!E;F%M92!$97)I=F5D5#X-"F-L87-S
M(&1E<FEV961?=F%L=65?:&]L9&5R._at_T*(" @('!U8FQI8R!V86QU95]H;VQD
M97(\0F%S950^#0I[#0IP=6)L:6,Z#0H@(" @9&5R:79E9%]V86QU95]H;VQD
M97(H8V]N<W0_at_1&5R:79E9%0F('9A;'5E*0T*(" @(#H@("!?=F%L=64H=F%L
M=64I#0H@(" @>PT*(" @('T-"@T*(" @('9I<G1U86P_at_0F%S950J(&=E="@I
M#0H@(" @>PT*(" @(" @("!R971U<FX@)E]V86QU93L-"B @("!]#0H-"B @
M("!V:7)T=6%L('9A;'5E7VAO;&1E<BH_at_8VQO;F4H*2!C;VYS= T*(" @('L-
M"B @(" @(" @<F5T=7)N(&YE=R!D97)I=F5D7W9A;'5E7VAO;&1E<BA?=F%L
M=64I.PT*(" @('T-"@T*(" @($1E<FEV9614(%]V86QU93L-"GT[#0H-"B\O
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2T-"B\O($]P=&EO;F%L
M(&AO;&1S('9A;'5E7VAO;&1E<CQ"87-E5#X@<&]I;G1E<B!T;PT*+R\@:6YS
M=&%N8V4@;V8_at_9&5R:79E9%]V86QU95]H;VQD97(\0F%S950L(#\_/SX-"@T*
M=&5M<&QA=&4\='EP96YA;64_at_0F%S950^#0IC;&%S<R!O<'1I;VYA; T*>PT*
M<'5B;&EC._at_T*#0H@(" @;W!T:6]N86PH*0T*(" @(#H@("!?=F%L=65?:&]L
M9&5R*$Y53$PI#0H@(" @>PT*(" @('T-"@T*(" @(&]P=&EO;F%L*&-O;G-T
M(&]P=&EO;F%L)B!O=&AE<BD-"B @(" Z(" @7W9A;'5E7VAO;&1E<BAO=&AE
M<BY?=F%L=65?:&]L9&5R+3YC;&]N92_at_I*0T*(" @('L-"B @("!]#0H-"B @
M("!T96UP;&%T93QT>7!E;F%M92!$97)I=F5D5#X-"B @("!O<'1I;VYA;"AC
M;VYS="!$97)I=F5D5"8@=F%L=64I#0H@(" @.B @(%]V86QU95]H;VQD97(H
M;F5W(&1E<FEV961?=F%L=65?:&]L9&5R/$)A<V54+"!$97)I=F5D5#XH=F%L
M=64I*0T*(" @('L-"B @("!]#0H-"B @("!^;W!T:6]N86PH*0T*(" @('L-
M"B @(" @(" @9&5L971E(%]V86QU95]H;VQD97([#0H@(" @?0T*#0H@(" @
M0F%S950J(&]P97)A=&]R+3XH*2!C;VYS= T*(" @('L-"B @(" @(" @<F5T
M=7)N(%]V86QU95]H;VQD97(M/F=E="@I.PT*(" @('T-"@T*(" @('9A;'5E
M7VAO;&1E<CQ"87-E5#XJ(%]V86QU95]H;VQD97([#0I].PT*#0HO+RTM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM#0H-"G9O:60@;6%I;B_at_I#0I[
M#0H@(" @+R\@0W)E871E(&YE=R!O<'1I;VYA;"!V86QU90T*(" @(&]P=&EO
M;F%L/$$^('@@/2!"*"D[#0H@(" @>"T^=&5S="@I.PT*#0H@(" @+R\@0V]P
M>2!O<'1I;VYA;"!V86QU90T*(" @(&]P=&EO;F%L/$$^('DH>"D[#0H@(" @
M>2T^=&5S="@I.PT*?0T*#0HO+RTM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
(+2TM+2TM#0H`
`
end


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk