2015-02-10 56 views
4

在下面的代碼Boost library作用get_unit_value的升壓ODEINT

template<class T , class Enabler = void > 
struct get_unit_value_impl 
{ 
    static T value(const T &t) 
    { 
     return t; 
    } 
    typedef T result_type; 
}; 

...

template<class T> 
typename detail::get_unit_value_impl<T>::result_type get_unit_value(const T &t) 
{ 
    return detail::get_unit_value_impl<T>::value(t); 
} 

get_unit_value的作用我不清楚。它有什麼作用?我們傳遞一些東西給它,並返回相同的值。爲什麼有人要把它包裝成一個結構?除了減慢運行時間之外,它還能做什麼嗎?

此代碼是從here稱爲:

template< class Fac1 = double > 
struct rel_error 
{ 
    const Fac1 m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt; 

    rel_error(Fac1 eps_abs , Fac1 eps_rel , Fac1 a_x , Fac1 a_dxdt) 
    : m_eps_abs(eps_abs) , m_eps_rel(eps_rel) , m_a_x(a_x) , m_a_dxdt(a_dxdt) { } 


    template< class T1 , class T2 , class T3 > 
    void operator()(T3 &t3 , const T1 &t1 , const T2 &t2) const 
    { 
     using std::abs; 
     set_unit_value(t3 , abs(get_unit_value(t3))/(m_eps_abs + m_eps_rel * (m_a_x * abs(get_unit_value(t1)) + m_a_dxdt * abs(get_unit_value(t2))))); 
    } 

    typedef void result_type; 
}; 
+1

運行時不應該由該模板的影響。優化器應該完全消除它。 – headmyshoulder 2015-02-10 14:52:24

回答

2

你忘了複製的特例之一:

template<class T , class Enabler = void > 
struct get_unit_value_impl 
{ 
    static T value(const T &t) 
    { 
     return t; 
    } 
    typedef T result_type; 
}; 

#ifndef __CUDACC__ 
template<class Unit , class T> 
struct get_unit_value_impl< boost::units::quantity< Unit , T> > 
{ 
    static T value(const boost::units::quantity< Unit , T> &t) 
    { 
     return t.value(); 
    } 
    typedef T result_type; 
}; 
#endif 

get_unit_value()是取一個值並返回,或boost::unit::quantity<Unit, T>並將其返回。這樣一來,調用者不需要擔心,如果t只是一個int或更復雜的東西:

int x = 7; 
quantity<length> L = 2.0*meters; 

get_unit_value(x); // 7 
get_unit_value(L); // 2.0 
+0

非常感謝。現在,我更好地理解了這個目的。但它還不完全清楚。我從中看到的是,如果沒有CUDA ACCelerator,那麼採用參數的「值」?但是如果有CUDA ACC不這樣做?但爲什麼? – torbani 2015-02-10 12:16:49

+0

@torbani那我不能說。我對CUDA一無所知,爲什麼這個功能在這種情況下沒有實現。我只能說它爲什麼存在。 – Barry 2015-02-10 12:19:08

+0

@torbani CUDA編譯器因爲看到任何Boost頭文件而出現故障;我想有人試圖在Boost身邊保守。 – DanielKO 2015-02-10 14:48:11