在使用表达模板的矩阵库中实现一个行类别的分配运算符
Implementing an assignment operator for a row class in a matrix library which uses expression templates
假设我们有一个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
配备以下操作:
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
。我们该怎么做?
我已经掌握了上面的实现详细信息,但这是您需要回答我问题的东西的实时演示。
在成员类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;
}
相关文章:
- 一个关于在C++中重载布尔运算符的问题
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 为 std::variant 提供一个运算符 ==
- 一元*运算符的操作数是否期望一个 prvalue
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 运算符重载:"operator+"必须采用零个或一个参数
- 重载运算符*以获取对另一个类的实例的引用
- 使用 scope 运算符 (::) 引用另一个文件中的类
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 在一个指令中声明更多指针的运算符优先级
- 为什么有条件编译运算符模板会更改另一个运算符的可用性?
- 我重载了一个运算符*()函数来计算两个矩阵的总和,但编译器提示此错误
- 基于范围的循环使用另一个运算符
- 在C++中,我可以使用箭头运算符访问另一个运算符吗
- 卡住了---用C++创建一个运算符模板
- 为什么一个运算符的操作数需要具有相同的类型
- 是否可以为 C++ 的字符串类创建一个运算符+函数?并连接"literals"?
- 如何为 boost::tuple 编写一个 '<<' 运算符?