假设我们有一个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
分配给row
。当然,如果matrix_expression
对象的相关row
不是&#34;可分配&#34;,则应禁用此类运算符。
以下是有用类型特征的第一个想法:
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
级别实现此目标,以便&#34;兼容&#34; (即元素是可转换的)vector_expression
可以分配给&#34;可分配的&#34; (在上述意义上)vector_expression
。我们怎么能这样做?
我已经隐藏了上面的实施细节,但是here是您回答我的问题所需内容的实时演示。
答案 0 :(得分:-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;
}