C++庫研究筆記——使用函數模板還是類模板?+ 一個類型重複問題的兩種解決方案

來源:互聯網
上載者:User

進行初步設計:

涉及的問題是:

template<typename T>class Sin{public:T operator()(T x){...};};Sin<float> sin;float x;sin(x);Sin<double> sin;float x;sin(x);//error///////////////////////////////////////////////////class Sin{public:template<typename T>T operator()(T x){...};};

Sin sin;float x;sin(x);Sin sin;double x;sin(x);


比較:
第一種會方便。
第二種會方便。


做了一些試探性的設計,發現確實class template 更好:

template <typename T>class {public:    typedef T   value_type;    virtual ~objective_function();    virtual size_t  dim() const =0;    virtual T       operator() (const T * x, T * g=0)const =0;    virtual bool    progress(int n, const T* x, T fx, const T * g,                            T gnorm) const;
// 設計過於複雜template<typename T, class FunObj>class minimizer{public:    typedef     T   value_type;    virtual void do_get_direction(array1d<T>& d);    void main_loop(array1d<T>& x)    {        array1d<T> d(x.size());        T f;        f=FunObj(x, g);        progress();        while(1)        {            do_get_direction(d);            T t=get_initial_step();            do_line_search(x, t, f, g, x_new, f_new, g_new);            if(!(bool continue=progress()))                break;            if(bool stop=stop_if_optimal(g, f))                break;        }    }    virtual T do_get_step(T initial);    virtual T get_initial_step();    virtual void do_line_search(array1<T>& x,  T& t, T& f, array1d<T>& g);    // virtual bool stop_if_optimal(const array1d<T>&g, T f);    virtual bool progress();};

// FunObj is FunObj<T>template<typename T, class FunObj>class minimizer{public:    typedef     T   value_type;


:保證T 與 FunObj<T> 完全一致

template <typename T, template<typename> class FunObj>
class minimizer<T, FunObj<T> >
// 類似的,可以這樣寫
// std::allocator<T>template <template<class, class > class C, typename T>void test(C<T,std::allocator<T> >& A, T x, int N){    T v;    v=A[0]*x;    cout<<v<<endl;}

解決方案2

// 缺點也很明顯: 比如涉及:1.0, FuncObj<float> , 1.0 預設的是double類型, 使用者沒有想把這些類都變成double類型,只是寫掉了一個f, 1.0f, 但編譯器不會報告錯誤

template <T1, T2>struct larger_type{typedef T1type;}template <>struct larger_type<float, double>{typedef doubletype;}





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.