2017-04-19 20 views
0

假設我們有一個matrix類,它利用表達式模板,以便代理對象用於使編譯器優化複合表達式。現在在使用表達式模板的矩陣庫中爲行類實現賦值運算符

,這是很自然的創造row類的格式如下:

namespace detail 
{ 
    template<class E> 
    class row 
     : public vector_expression<row<E>> 
    { 
    public: 
     using size_type = size_type_t<E>; 

     template<class F> 
     row(F&& e, size_type i) 
      : m_e(std::forward<F>(e)), 
       m_i(i) 
     {} 

     result_of_call_operator_t<E&> operator()(size_type j) { return m_e(m_i, j); } 
     result_of_call_operator_t<E const&> operator()(size_type j) const { return m_e(m_i, j); } 

    private: 
     E m_e; 
     size_type const m_i; 
    }; 
} 

與以下形式的相應的輔助函數:

template<class E, class = 
    std::enable_if_t<detail::is_matrix_expression_v<E>>> 
detail::row<E> row(E&& e, detail::size_type_t<E> i) { 
    return { std::forward<E>(e), i }; 
} 

的想法是,一個row威力成爲實際的matrix對象或(時間)matrix_expression的行。

我想現在要做的是裝備row與賦值操作符,使得我們能分配(兼容)vector_expression s到一個row什麼。當然,如果row對象的相關matrix_expression不是「可分配的」,則應禁用此類運算符。

下面是一個有用的類型性狀的第一個想法:

template<class E, class F> 
using is_assignable_t = decltype(std::declval<result_of_call_operator_t<E>>() = std::declval<result_of_call_operator_t<F>>()); 
template<class E, class F> 
constexpr bool is_assignable_v = is_detected_v<is_assignable_t, E, F>; 

現在的問題是,我們可能有一個column類和許多類似的類了。所以,我正在尋找一種方法來實現上述想法,這種方式不會強制我爲每個類添加賦值運算符。

準確地說,我能裝備row具有以下operaotr:

template<class F, 
    class = std::enable_if_t<is_assignable_v<E&, F>>> 
row& operator=(vector_expression<F> const& e) 
{ 
    /* ... */ 
    return *this; 
} 

不過,我需要這樣的運營商加入到column類和其他類這樣的了。

總之,我想在vector_expression水平,使得「兼容」(即要素是可兌換)vector_expression實現此可以被分配給一個「分配」(在上述意義上)vector_expression。我們怎麼做到這一點?

我已經隱藏了上面的實現細節,但here是你需要回答我的問題的現場演示。

回答

-1

在成員類numeric::detail::row,已經定義元件(m_e)和索引(m_i),然後我的代碼是這樣的:

 template<class F, 
      class = std::enable_if_t<is_assignable_v<E&, F>>> 
      row& operator=(vector_expression<F> const& e) 
     { 
      for (size_type i = 0; i < m_e.row_size(); ++i) 
      { 
       m_e(m_i, i) = e(i); 
      } 
      return *this; 
     } 
相關問題