2012-11-23 42 views
0

添加我使用boost :: mpl :: *并尝试扩展物理单元示例的时刻。目前我有以下代码:如何优化boost :: mpl ::向量代码?

template < int Mass, int Length, int Time, int Temperature, int Angle, int Current > 
    struct base_dimension 
    { 
     typedef typename mpl::vector_c< int, Mass, Length, Time, Temperature, Angle, Current >::type type; 
    }; 

标量向量:

typedef base_dimension< 0, 0, 0, 0, 0, 0 >::type base_dimensionless_helper; 

简单类型存储base_dimension通过MPL ::向量表示

一个简单的物理基本尺寸类型:

标量尺寸:

typedef Dimension<base_dimensionless_helper> base_dimensionless; 

一些简单的辅助:

template < class D1, int fac > 
    struct mul_base_dim_fac_typeof 
    { 
     typedef typename base_dimension< fac, fac, fac, fac, fac, fac >::type fac_vec; 
     typedef typename Detail::multiply_typeof_helper< typename D1, fac_vec >::type type; 
    }; 


template < class Dim1, class Dim2 > 
    struct add_dim_typeof_helper 
    { 
     typedef typename add_base_dim_typeof_helper< typename Dim1::base_dim_type, typename Dim2::base_dim_type >::type dim; 

     typedef Dimension<dim> type; 
    }; 

最后派生维度。所使用的公式为: (D0 * E0)+(D1 * E1)+ ... +(D5 * E5)... ::类型

template < class D0 = base_dimensionless, int E0 = 0, 
     class D1 = base_dimensionless, int E1 = 0, 
     class D2 = base_dimensionless, int E2 = 0, 
     class D3 = base_dimensionless, int E3 = 0, 
     class D4 = base_dimensionless, int E4 = 0, 
     class D5 = base_dimensionless, int E5 = 0 > 
struct derived_dimension 
{ 
    typedef Dimension< typename mul_base_dim_fac_typeof< typename D0::base_dim_type, E0 >::type > d0_type; 
    typedef Dimension< typename mul_base_dim_fac_typeof< typename D1::base_dim_type, E1 >::type > d1_type; 
    typedef Dimension< typename mul_base_dim_fac_typeof< typename D2::base_dim_type, E2 >::type > d2_type; 
    typedef Dimension< typename mul_base_dim_fac_typeof< typename D3::base_dim_type, E3 >::type > d3_type; 
    typedef Dimension< typename mul_base_dim_fac_typeof< typename D4::base_dim_type, E4 >::type > d4_type; 
    typedef Dimension< typename mul_base_dim_fac_typeof< typename D5::base_dim_type, E5 >::type > d5_type; 

    typedef typename Detail::add_dim_typeof_helper< d0_type, d1_type >::type d0_d1_type; 
    typedef typename Detail::add_dim_typeof_helper< d0_d1_type, d2_type >::type d0_d1_d2_type; 
    typedef typename Detail::add_dim_typeof_helper< d0_d1_d2_type, d3_type >::type d0_d1_d2_d3_type; 
    typedef typename Detail::add_dim_typeof_helper< d0_d1_d2_d3_type, d4_type >::type d0_d1_d2_d3_d4_type; 
    typedef typename Detail::add_dim_typeof_helper< d0_d1_d2_d3_d4_type, d5_type >::type type; 
}; 

确定这确实按预期方式工作。但是我想美化派生维度的计算,因为所有这些中间类型定义都很丑陋。我的第一个想法是将输入向量推入一个向量( - >向量向量),并在一个很好的for_each循环内将它们相乘,但直到现在没有成功。所以我的问题是:

任何提示如何美化计算?

+1

mpl和beauty是oxymorons ... :) – Nim

+0

很好:)但我认为一个熟练的mpl用户可以优化我的东西。 – Mark

回答

0

你可以通过定义一个辅助函数,澄清乘法开始:

template < typename D, int E > 
struct multiply 
{ 
    typedef Dimension< typename 
     mul_base_dim_fac_typeof< typename 
      D::base_dim_type, 
      E 
     >::type 
    > type; 
}; 

你也可以使用算法,比如transformfold(当然,你宁愿需要reduce,但它不提供MPL):

template < class D0 = base_dimensionless, int E0 = 0, 
      class D1 = base_dimensionless, int E1 = 0, 
      class D2 = base_dimensionless, int E2 = 0, 
      class D3 = base_dimensionless, int E3 = 0, 
      class D4 = base_dimensionless, int E4 = 0, 
      class D5 = base_dimensionless, int E5 = 0 > 
struct derived_dimension 
{ 
    typedef mpl::vector< 
     mpl::pair< D0, E0 >, mpl::pair< D1, E1 >, 
     mpl::pair< D2, E2 >, mpl::pair< D3, E3 >, 
     mpl::pair< D4, E4 >, mpl::pair< D5, E5 > 
    > pairs; 

    typedef typename 
     mpl::transform< 
      pairs, 
      multiply< mpl::first<mpl::_1>, mpl::second<mpl::_1>; 
     >::type products; 

    typedef typename 
     mpl::fold< 
      products, 
      base_dimensionless, 
      add_dim_typeof_helper< mpl::_, mpl::_ > 
     >::type type; 
}; 

免责声明:我没有测试过这些代码在所有的,其目的仅仅是给你的东西可以用MPL做的想法。

或者,您可以使用预处理器生成连续的typedefs,可能需要Boost.Preprocessor的帮助。