- 论坛徽章:
- 1
|
windoze 发表于 2014-11-20 22:12
回复 8# lost_templar
我是说tagged union,也就是Algebraic data type,能存一组不同类型的数据,通过一个tag标记到底保存了什么类型。
这种东西其实经常能用到,比如说一个JSON value,就有可能是一个数字、字符串、数组或者一个map,你要实现这么个东西就需要一个类似的结构。
如果让我存储一组不同类型的数据,我可能直接用一个 lambda 函数或 tuple 做容器,这样来做
- template<typename ... Args >
- auto container( Args ... args )
- {
- return [=]( auto function ){ return function( args... ); };
- }
复制代码 加上前文的 overloader- template< typename Arg, typename ... Args >
- struct overloader : Arg, overloader<Args...>
- {
- overloader( Arg arg_, Args ... args_ ) : Arg(arg_), overloader<Args...>( args_... ) {}
- };
- template< typename Arg >
- struct overloader<Arg> : Arg
- {
- overloader( Arg arg_ ) : Arg(arg_){}
- };
- template< typename ... Args >
- auto make_overloader( Args ... args_ )
- {
- return overloader<Args...>{ args_... };
- }
复制代码 再加上一个 function mapper 来处理容器里边的数据
- template< typename F >
- auto function_mapper( F f )
- {
- return [=]( auto ... args ){ return container( f(args)... ); };
- }
复制代码 这样一来,就可以直接存储不同类型的数据到一个 lambda 中去
- auto my_data = container( 1, 1.0, "data", true, 4.3 );
复制代码 然后针对存储的类型生成处理函数
- auto process = make_overloader( []( int i ){...}, []( double d){...}, [](bool b){...}, [](string s){...} );
复制代码 最后将这个函数应用到 lambda 容器上去
- my_data( function_mapper( process ) );
复制代码 |
|