我有一个模板类,它有一个布尔模板参数。是否有合法的方法将其转换为对同一对象的引用,但布尔值反转?
作为一个示例,下面我有一个Matrix类,其转置可以用相同的对象数据表示,但反转的“转置”模板参数。
template <bool transposed>
class Transposable_matrix
{
...
Transposable_matrix<!transposed>& transpose()
{
static_cast<Transposable_matrix<!transposed>& >(*this);
}
};
上面的“transpose()”方法试图在不执行复制的情况下转置对象,只需返回对自身的引用但转换后的标志被反转。但是,可能不出所料,转换操作在编译时失败。这样做是否有可接受的方法?我猜reinterpret_cast不能保证正确性。我可以使用代理对象来表示转置对象,但这将涉及重构整个类。
修改
使用重新解释后,我的所有单元测试都在通过。但重新解释演员让我感到紧张 - 这是否属于“未定义行为”的范畴,我只是幸运的?或者由于这两种类型(Matrix<true>
和Matrix<false>
)具有相同的成员,我应该安全吗?
编辑2 请注意这个类没有虚拟方法会有帮助吗?因此,无论转置状态如何,数据成员的点对点副本都应该是有效的,因此c样式转换(或重新解释转换)应始终按照我的预期进行,对吧?
答案 0 :(得分:3)
下面的“transpose()”方法试图在不执行复制的情况下转置对象,只需返回对自身的引用但转换后的标记已反转。
这是不可能的。
对于transposed
(布尔值)的任何值,Transposable_matrix<true>
和Transposable_matrix<false>
是两种不同且不兼容的类型。使用static_cast
无法将其转换为另一个。