|
Boost : |
From: Eric Friedman (ebf_at_[hidden])
Date: 2002-07-21 22:58:37
See my attached implementation of extract.hpp (the current version of what
is being used in Boost.Variant).
Simplified implementation (i.e. without const considerations, workarounds,
etc.):
template <typename Holder>
struct extract_traits;
template <typename T, typename Holder>
T* extract(Holder* operand)
{
if (!operand) return static_cast<T*>(0);
return extract_traits<Holder>::template
extract_pointer<T>(*operand);
}
template <typename T, typename Holder>
T& extract(Holder& operand)
{
T* result = extract_traits<Holder>::template
extract_pointer<T>(operand);
if (!result) throw bad_extract();
return *result;
}
--- This approach: * Is extensible (via extract_traits specializations). * Is similar to any_cast and dynamic_cast (in terms of pointer vs. reference semantics). * Centralizes extract's behavior (though workarounds for lack of partial specialization undermines this to some extent). Only extract_traits<Holder>::extract_pointer must be implemented for a given Holder, for which no null-pointer tests are needed. Let me know what you think. Eric "David Abrahams" <david.abrahams_at_[hidden]> wrote in message news:141701c230cc$76960500$6501a8c0_at_boostconsulting.com... > > From: "Itay Maman" <itay_maman_at_[hidden]> > > > > I realize that poses some problems for unification, since it's not > > possible > > > to non-intrusively customize constructors for a single class template. > I'm > > > willing to discuss changes, if neccessary. > > > > > > -Dave > > > > > > > (i) Is it in the CVS? > > Yes: boost/python/extract.hpp > > > (ii) There's this MSVC namespace-related bug, which makes it impossible > to > > use extract<T>(x). The workaround I have used so far, is to pass T as a > > dummy parameter, i.e: extract(x, boost::type<T>()); > > The class formulation doesn't suffer from that, but there's also a > workaround for the function formulation... > > > I wonder if there are other workarounds which will not affect the > interface > > of the function? > > > template <class T, class U> > whatever extract(variant<U> const&, boost::type<T>* = 0); > > -Dave > > > _______________________________________________ > Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost > begin 666 extract.hpp M+R\M+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+2TM+0T*+R\@8F]O<W0@ M97AT<F%C="YH<' @:&5A9&5R(&9I;&4-"B\O(%-E92!H='1P.B\O=W=W+F)O M;W-T+F]R9R!F;W(@=7!D871E<RP_at_9&]C=6UE;G1A=&EO;BP_at_86YD(')E=FES M:6]N(&AI<W1O<GDN#0HO+RTM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM M+2TM#0HO+PT*+R\@0V]P>7)I9VAT("AC*2 R,# R#0HO+R!%<FEC($9R:65D M;6%N#0HO+PT*+R\@4&5R;6ES<VEO;B!T;R!U<V4L(&-O<'DL(&UO9&EF>2P@ M9&ES=')I8G5T92!A;F0@<V5L;"!T:&ES('-O9G1W87)E#0HO+R!A;F0@:71S M(&1O8W5M96YT871I;VX_at_9F]R(&%N>2!P=7)P;W-E(&ES(&AE<F5B>2!G<F%N M=&5D('=I=&AO=70_at_9F5E+" -"B\O('!R;W9I9&5D('1H870@=&AE(&%B;W9E M(&-O<'ER:6=H="!N;W1I8V4_at_87!P96%R<R!I;B!A;&P_at_8V]P:65S(&%N9" - M"B\O('1H870_at_8F]T:"!T:&4_at_8V]P>7)I9VAT(&YO=&EC92!A;F0@=&AI<R!P M97)M:7-S:6]N(&YO=&EC92!A<'!E87(@:6X@#0HO+R!S=7!P;W)T:6YG(&1O M8W5M96YT871I;VXN($YO(')E<')E<V5N=&%T:6]N<R!A<F4@;6%D92!A8F]U M="!T:&4@#0HO+R!S=6ET86)I;&ET>2!O9B!T:&ES('-O9G1W87)E(&9O<B!A M;GD@<'5R<&]S92X_at_270@:7,@<')O=FED960@(F%S(&ES(B -"B\O('=I=&AO M=70_at_97AP<F5S<R!O<B!I;7!L:65D('=A<G)A;G1Y+@T*#0HC:69N9&5F($)/ M3U-47T585%)!0U1?2%!0#0HC9&5F:6YE($)/3U-47T585%)!0U1?2%!0#0H- M"B-I;F-L=61E(#QE>&-E<'1I;VX^#0HC:6YC;'5D92 \8F]O<W0O;7!L+V%P M<&QY7VEF+FAP<#X-"B-I;F-L=61E(#QB;V]S="]M<&PO87-S97)T7VES7W-A M;64N:'!P/@T*(VEN8VQU9&4@/&)O;W-T+VUP;"]B;V]L7V,N:'!P/@T*(VEN M8VQU9&4@/&)O;W-T+VUP;"]S96QE8W1?:68N:'!P/@T*(VEN8VQU9&4@/&)O M;W-T+W5T:6QI='DO861D<F5S<V]F+FAP<#X-"@T*+R\@5&AE(&9O;&QO=VEN M9R!A<F4@;F5W+VEN+7!R;V=R97-S(&AE861E<G,@;W(@9FEX97,@=&\@97AI M<W1I;F<@:&5A9&5R<SH-"B-I;F-L=61E(")B;V]S="]E>'1R86-T7V9W9"YH M<' B#0HC:6YC;'5D92 B8F]O<W0O9&5T86EL+W9A<FEA;G1?=V]R:V%R;W5N M9"YH<' B#0HC:6YC;'5D92 B8F]O<W0O;7!L+W1Y<&5?=')A:71S+V-O;7!O M<VET95]T<F%I=',N:'!P(B O+R!F;W(@:7-?<&]I;G1E<@T*(VEN8VQU9&4@ M(F)O;W-T+VUP;"]T>7!E7W1R86ET<R]C=E]T<F%I=',N:'!P(B O+R!F;W(@ M:7-?8V]N<W0-"B-I;F-L=61E(")B;V]S="]M<&PO='EP95]T<F%I=',O=')A M;G-F;W)M7W1R86ET<RYH<' B("\O(&9O<B!A9&1?<&]I;G1E<BP_at_861D7W)E M9F5R96YC90T*#0IN86UE<W!A8V4_at_8F]O<W0@>PT*#0HO+R!C;&%S<R!B861? M97AT<F%C= T*+R\-"B\O(%1H92!E>&-E<'1I;VX@=&AR;W=N(&EN('1H92!E M=F5N="!O9B!A(&9A:6QE9"!E>'1R86-T#0HO+R!O9B!A(')E9F5R96YC92!V M86QU92X-"F-L87-S(&)A9%]E>'1R86-T#0H@(" @.B!P=6)L:6,@<W1D.CIE M>&-E<'1I;VX-"GL-"G!U8FQI8SH-"B @("!V:7)T=6%L(&-O;G-T(&-H87(@ M*B!W:&%T*"D_at_8V]N<W0*(" @('L*(" @(" @("!R971U<FX@(F)O;W-T.CIB M861?97AT<F%C=#H@(@H@(" @(" @(" @(" @(" B9F%I;&5D(&5X=')A8W1I M;VX@=7-I;F<@8F]O<W0Z.F5X=')A8W0B.PH@(" @?0T*?3L-"@T*+R\@8VQA M<W,@=&5M<&QA=&4_at_97AT<F%C=%]T<F%I=',-"B\O#0HO+R!#;&%S<R!T96UP M;&%T92!M96%N="!T;R!B92!S<&5C:6%L:7IE9"!F;W(@='EP97,@=VES:&EN M9R!T;R!O9F9E<@T*+R\@("!E>'1R86-T/%0^*"XN+BD_at_9G5N8W1I;VYA;&ET M>2X-"B\O($Y/5$4Z(&5X=')A8W1?=')A:71S.CIE>'1R86-T7W!O:6YT97(H M+BXN*2!M=7-T(&)E(&1E9FEN960@:6X_at_86YY#0HO+R @('-P96-I86QI>F%T M:6]N(&]F(&5X=')A8W1?=')A:71S+@T*=&5M<&QA=&4@/'1Y<&5N86UE($AO M;&1E<CX-"G-T<G5C="!E>'1R86-T7W1R86ET<PT*>PT*#0HC:68@(61E9FEN M960H0D]/4U1?3D]?5$5-4$Q!5$5?4$%25$E!3%]34$5#24%,25I!5$E/3BD- M"@T*"71E;7!L871E(#QT>7!E;F%M92!4/@T*"7-T871I8R!4*B!E>'1R86-T M7W!O:6YT97(H2&]L9&5R)B!O<&5R86YD*0T*"7L-"@D)+R\@6T1E9F%U;'0@ M:6UP;&5M96YT871I;VX@<F5Q=6ER97,@=&AE(&AO;&1E<B!A;F0@=&AE(')E M<W5L="!T;R!B92!T:&4@<V%M93I=#0H)"4)/3U-47TU03%]!4U-%4E1?25-? M4T%-12@@2&]L9&5R+%0@*3L-"@D)<F5T=7)N(&)O;W-T.CIA9&1R97-S;V8H M;W!E<F%N9"D[#0H)?0T*#0H)=&5M<&QA=&4@/'1Y<&5N86UE(%0^#0H)<W1A M=&EC(%0J(&5X=')A8W1?<&]I;G1E<BAC;VYS="!(;VQD97(F(&]P97)A;F0I M#0H)>PT*"0DO+R!;1&5F875L="!I;7!L96UE;G1A=&EO;B!R97%U:7)E<R!T M:&4@:&]L9&5R(&%N9"!T:&4@<F5S=6QT('1O(&)E('1H92!S86UE.ET-"@D) M0D]/4U1?35!,7T%34T525%])4U]304U%*"!C;VYS="!(;VQD97(L5" I.PT* M"0ER971U<FX_at_8F]O<W0Z.F%D9')E<W-O9BAO<&5R86YD*3L-"@E]#0H-"B-E M;'-E+R\@9&5F:6YE9"A"3T]35%].3U]414U03$%415]005)424%,7U-014-) M04Q)6D%424].*0T*#0IP<FEV871E._at_T*"71E;7!L871E(#QT>7!E;F%M92!4 M/@T*"7-T<G5C="!E>'1R86-T7W!O:6YT97)?:6UP; T*"7L-"@D)<W1A=&EC M(%0J(&5X96-U=&4H#0H)"0D@($AO;&1E<B8@;W!E<F%N9 T*"0D)+"!M<&PZ M.G1R=65?8R\O(&ES7W9A<FEA;G0-"@D)"2D-"@D)>PT*"0D)<F5T=7)N(&1E M=&%I;#HZ=F%R:6%N=%]E>'1R86-T7W!O:6YT97(\5#XH;W!E<F%N9"D[#0H) M"7T-"@T*"0ES=&%T:6,@5"H_at_97AE8W5T92@-"@D)"2 @8V]N<W0_at_2&]L9&5R M)B!O<&5R86YD#0H)"0DL(&UP;#HZ=')U95]C+R\@:7-?=F%R:6%N= T*"0D) M*0T*"0E[#0H)"0ER971U<FX_at_9&5T86EL.CIV87)I86YT7V5X=')A8W1?<&]I M;G1E<CQ4/BAO<&5R86YD*3L-"@D)?0T*#0H)"7-T871I8R!4*B!E>&5C=71E M* T*"0D)("!(;VQD97(F(&]P97)A;F0-"@D)"2P@;7!L.CIF86QS95]C+R\@ M:7-?=F%R:6%N= T*"0D)*0T*"0E[#0H)"0DO+R!;1&5F875L="!I;7!L96UE M;G1A=&EO;B!R97%U:7)E<R!T:&4@:&]L9&5R(&%N9"!T:&4@<F5S=6QT('1O M(&)E('1H92!S86UE.ET-"@D)"4)/3U-47TU03%]!4U-%4E1?25-?4T%-12@@ M2&]L9&5R+%0@*3L-"@D)"7)E='5R;B!B;V]S=#HZ861D<F5S<V]F*&]P97)A M;F0I.PT*"0E]#0H-"@D)<W1A=&EC(%0J(&5X96-U=&4H#0H)"0D@(&-O;G-T M($AO;&1E<B8@;W!E<F%N9 T*"0D)+"!M<&PZ.F9A;'-E7V,O+R!I<U]V87)I M86YT#0H)"0DI#0H)"7L-"@D)"2\O(%M$969A=6QT(&EM<&QE;65N=&%T:6]N M(')E<75I<F5S('1H92!H;VQD97(@86YD('1H92!R97-U;'0@=&\@8F4@=&AE M('-A;64Z70T*"0D)0D]/4U1?35!,7T%34T525%])4U]304U%*"!C;VYS="!( M;VQD97(L5" I.PT*"0D)<F5T=7)N(&)O;W-T.CIA9&1R97-S;V8H;W!E<F%N M9"D[#0H)"7T-"@E].PT*#0IP=6)L:6,Z#0H)=&5M<&QA=&4@/'1Y<&5N86UE M(%0^#0H)<W1A=&EC(%0J(&5X=')A8W1?<&]I;G1E<BA(;VQD97(F(&]P97)A M;F0I#0H)>PT*"0ER971U<FX_at_97AT<F%C=%]P;VEN=&5R7VEM<&P\5#XZ.F5X M96-U=&4H#0H)"0D@(&]P97)A;F0-"@D)"2P@;7!L.CIB;V]L7V,\:7-?=F%R M:6%N=#Q(;VQD97(^.CIV86QU93XH*0T*"0D)*3L-"@E]#0H-"@ET96UP;&%T M92 \='EP96YA;64_at_5#X-"@ES=&%T:6,@5"H_at_97AT<F%C=%]P;VEN=&5R*&-O M;G-T($AO;&1E<B8@;W!E<F%N9"D-"@E[#0H)"7)E='5R;B!E>'1R86-T7W!O M:6YT97)?:6UP;#Q4/CHZ97AE8W5T92_at_-"@D)"2 @;W!E<F%N9 T*"0D)+"!M M<&PZ.F)O;VQ?8SQI<U]V87)I86YT/$AO;&1E<CXZ.G9A;'5E/B_at_I#0H)"0DI M.PT*"7T-"@T*(V5N9&EF("\O($)/3U-47TY/7U1%35!,051%7U!!4E1)04Q? M4U!%0TE!3$E:051)3TX@=V]R:V%R;W5N9 T*#0I].PT*#0HO+R\O+R\O+R\O M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O M+R\O+R\O+R\O+R\O+R\O+R\O+PT*+R\@9G5N8W1I;VX@=&5M<&QA=&4_at_97AT M<F%C=#Q4/@T*+R\-"B\O($%T=&5M<'1S(&$@8V]N=F5R<VEO;B!O9B!T:&4@ M9VEV96X@=F%L=64@=&\@='EP92!4+@T*#0IN86UE<W!A8V4_at_9&5T86EL('L- M"@T*=&5M<&QA=&4@/'1Y<&5N86UE(%0^#0IS=')U8W0_at_97AT<F%C=%]P;VEN M=&5R7VEM<&P-"GL-"G!R:79A=&4Z#0H@(" @=&5M<&QA=&4@/'1Y<&5N86UE M($AO;&1E<CX@#0H)<W1A=&EC(%0J(&5X96-U=&5?:6UP;"A(;VQD97(J(&]P M97)A;F0L(&UP;#HZ9F%L<V5?8RD-"B @("![#0H@(" @(" @(&EF("@A;W!E M<F%N9"D-"B @(" @(" @(" @(')E='5R;B!S=&%T:6-?8V%S=#Q4*CXH,"D[ M#0H)"7)E='5R;B!E>'1R86-T7W1R86ET<SQ(;VQD97(^.CIT96UP;&%T92!E M>'1R86-T7W!O:6YT97(\5#XH*F]P97)A;F0I.PT*(" @('T-"@T*"71E;7!L M871E(#QT>7!E;F%M92!(;VQD97(^( T*"7-T871I8R!4*B!E>&5C=71E7VEM M<&PH8V]N<W0_at_2&]L9&5R*B!O<&5R86YD+"!M<&PZ.G1R=65?8RD-"B @("![ M#0H@(" @(" @(&EF("@A;W!E<F%N9"D-"B @(" @(" @(" @(')E='5R;B!S M=&%T:6-?8V%S=#Q4*CXH,"D[#0H)"7)E='5R;B!E>'1R86-T7W1R86ET<SQ( M;VQD97(^.CIT96UP;&%T92!E>'1R86-T7W!O:6YT97(\5#XH*F]P97)A;F0I M.PT*(" @('T-"@T*<'5B;&EC._at_T*"71E;7!L871E(#QT>7!E;F%M92!(;VQD M97(^#0H)<W1A=&EC(%0J(&5X96-U=&4H2&]L9&5R*B!O<&5R86YD*0T*"7L- M"@D)<F5T=7)N(&5X96-U=&5?:6UP;"AO<&5R86YD+"!M<&PZ.F)O;VQ?8SQM M<&PZ.FES7V-O;G-T/$AO;&1E<CXZ.G9A;'5E/B_at_I*3L-"@E]#0I].PT*#0IT M96UP;&%T92 \='EP96YA;64_at_5"P_at_8F]O;"!I<U]C;VYS=#X-"G-T<G5C="!E M>'1R86-T7W)E9F5R96YC95]I;7!L#0I[#0IP<FEV871E._at_T*"71E;7!L871E M(#QT>7!E;F%M92!(;VQD97(^#0H)<W1A=&EC(%0F(&5X96-U=&5?:6UP;"A( M;VQD97(F(&]P97)A;F0L(&UP;#HZ9F%L<V5?8RD-"B @("![#0H)"50J(')E M<W5L=" ](&5X=')A8W1?=')A:71S/$AO;&1E<CXZ.G1E;7!L871E(&5X=')A M8W1?<&]I;G1E<CQ4/BAO<&5R86YD*3L-"B @(" @(" @:68@*"%R97-U;'0I M#0H@(" @(" @(" @("!T:')O=R!B861?97AT<F%C="@I.PT*(" @(" @("!R M971U<FX@*G)E<W5L=#L-"B @("!]#0H-"@ET96UP;&%T92 \='EP96YA;64@ M2&]L9&5R/@T*"7-T871I8R!4)B!E>&5C=71E7VEM<&PH8V]N<W0_at_2&]L9&5R M)B!O<&5R86YD+"!M<&PZ.G1R=65?8RD-"B @("![#0H)"50J(')E<W5L=" ] M(&5X=')A8W1?=')A:71S/$AO;&1E<CXZ.G1E;7!L871E(&5X=')A8W1?<&]I M;G1E<CQ4/BAO<&5R86YD*3L-"B @(" @(" @:68@*"%R97-U;'0I#0H@(" @ M(" @(" @("!T:')O=R!B861?97AT<F%C="@I.PT*(" @(" @("!R971U<FX@ M*G)E<W5L=#L-"B @("!]#0H-"G!U8FQI8SH-"@ET96UP;&%T92 \='EP96YA M;64_at_2&]L9&5R/@T*(" @('-T871I8R!4)B!E>&5C=71E*$AO;&1E<B8@;W!E M<F%N9"D-"B @("![#0H)"7)E='5R;B!E>&5C=71E7VEM<&PH;W!E<F%N9"P@ M;7!L.CIB;V]L7V,\;7!L.CII<U]C;VYS=#Q(;VQD97(^.CIV86QU93XH*2D[ M#0H@(" @?0T*?3L-"@T*?2 O+R!N86UE<W!A8V4_at_9&5T86EL#0H-"G1E;7!L M871E(#QT>7!E;F%M92!4+"!T>7!E;F%M92!(;VQD97(^#0H@(" @='EP96YA M;64@;7!L.CIA<'!L>5]I9CP-"B @(" @(" @("!M<&PZ.FES7W!O:6YT97(\ M2&]L9&5R/@T*(" @(" @(" L(&UP;#HZ861D7W!O:6YT97(\5#X-"B @(" @ M(" @+"!M<&PZ.F%D9%]R969E<F5N8V4\5#X-"B @(" @(" @/CHZ='EP90T* M97AT<F%C="A(;VQD97(F(&]P97)A;F0I#0I[#0H@(" @='EP961E9B!T>7!E M;F%M92!M<&PZ.G-E;&5C=%]I9CP-"B @(" @(" @("!M<&PZ.FES7W!O:6YT M97(\2&]L9&5R/@T*(" @(" @(" L(&1E=&%I;#HZ97AT<F%C=%]P;VEN=&5R M7VEM<&P\5#X-"@D)+"!D971A:6PZ.F5X=')A8W1?<F5F97)E;F-E7VEM<&P\ M5"P@;7!L.CII<U]C;VYS=#Q(;VQD97(^.CIV86QU93X-"B @(" @(" @/CHZ M='EP92!I;7!L.PT*#0H@(" @<F5T=7)N(&EM<&PZ.F5X96-U=&4H;W!E<F%N M9"D[#0I]#0H-"GT@+R\@;F%M97-P86-E(&)O;W-T#0H-"B-E;F1I9B O+R!" 23T]35%]%6%1204-47TA04 T* ` end
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk