假設我們有一個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是你需要回答我的問題的現場演示。