Re: x3::variant vs boost::variant

Baptiste Wicht <[email protected]>
Newsgroups gmane.comp.parsers.spirit.general
Message-ID <[email protected]>
On Sun, Feb 21, 2016 at 09:55:02AM +0800, Joel de Guzman wrote:
> On 2/20/16 5:14 PM, Baptiste Wicht wrote:
> > On Sat, Feb 20, 2016 at 05:42:14AM +0800, Joel de Guzman wrote:
> >> On 2/18/16 4:48 AM, Baptiste Wicht wrote:
> >>
> >>> The main problem that remains is with x3::variant and x3::forward_ast:
> >>>
> >>> I have a type like this:
> >>>
> >>>       using Type = boost::spirit::x3::variant<
> >>>               SimpleType,
> >>>               boost::spirit::x3::forward_ast<ArrayType>,
> >>>               boost::spirit::x3::forward_ast<TemplateType>,
> >>>               boost::spirit::x3::forward_ast<PointerType>
> >>>           >;
> >>>
> >>> And a lot of code resembling this:
> >>>
> >>>       if(auto* ptr = boost::get<ast::SimpleType>(&type)){
> >>>           //Do something on *ptr
> >>>       } else if(auto* ptr = boost::get<ast::ArrayType>(&type)){
> >>>           //Do something on *ptr
> >>>       } else if(auto* ptr = boost::get<ast::PointerType>(&type)){
> >>>           //...
> >>>       }
> >>>       //...
> >>>
> >>> But this does not work since ArrayType is not a member of the variant
> >>> because of the forward_ast and I have an error from boost strict_get.
> >>>
> >>> I really have a lot of code like this, I won't be able (neither have the
> >>> motivation for it) to change all of it. If there is no simple solution,
> >>> I'll use my old AST with boost::variant and recursive_wrapper.
> >>>
> >>> Is there anything I can do to use boost::get with forward_ast ?
> >>
> >> There should be a solution. tell you what. Give me a minimal test
> >> case and I can work on getting it compile and run as expected.
> >
> > Here it is: http://coliru.stacked-crooked.com/a/641b689346ff322c
>
> There is a solution, but it involves some meta code that can slow down CT.
> I'm not sure if it's worth it. The only reasonable solution is to simply
> get<forward_ast<T>>(v).

I found a simple solution finally, I just created a wrapper around
boost::get and then used macros to generate partial specializations of
my wrapper for handling all forward_ast, this makes for nice code and
very few changes in the compiler (thank you sed). The wrapper and macro
is here: https://github.com/wichtounet/eddic/blob/develop/include/smart_get.hpp

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140

_______________________________________________
Spirit-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spirit-general
signature.asc (application/pgp-signature, 801 B)
-----BEGIN PGP SIGNATURE-----

iQIcBAEBCgAGBQJWyah2AAoJEMVWa2x/iEUyxpcQAIcjldobtvmHMFfflYfLYR36
WptyN9O1NNY/wcS4pLZOeNKihJUWGVXHg97guYZahUIk6x7eJvlMLDl/XYaAmhai
gEtjBiWgcdqEu9XcNoIxz2ITdNvXTNRWJkOIT9AGheJx0dUsWLHg/0YX67kcXaAB
5DUdl54IPz+mJkZ5ScOstWjNi1QSdxHxiMGajhQnrOf7mThWoR/JrvEs4e+/ywKP
MvmTRzIrK5UQsgaw+WsneF8y+iDCDjeCOBeLkVuzqWw80pHmn3A/NE90iqTsC1we
CCjt1tH/r90G2CEftAEiO4W7gxBjbKbUw8jgieZx+dk4+rkjGju16Fd0BKDEg6aT
vRM+3DJHYdJNHS1fiUXVwcqXrbndH2CFMBHuHb7zE7c74WydLn+DtkPYZD2s/+fM
hzq5tjIF9pyoCcenyKl9IrMIZKOE2//zt2XOSzKueBwkTLDurt34UxbnHxVYYiT0
Z8MUukddX257sA7J6VDlP24IXutz9NdxDeRj4dGJZIuzOusIvE01xBgRCOPY8Z3m
S1zeL6A0Uz1L1xNskyI/XNFdJuCm1m+aSVxnkHtkqZKE2j+KlMZLC15Ovmy31EVF
Ylzh8sMTbxKk5s8othSonq5RdmnY9PA2ItlTEKb8BGiOOekoXsnxZkpkuCUhevYb
mrdHaOILB/dR0+jresJj
=MGb7
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.