转换模板值参数

时间:2011-11-14 05:37:33

标签: c++ templates casting

我有一个模板类,它有一个布尔模板参数。是否有合法的方法将其转换为对同一对象的引用,但布尔值反转?

作为一个示例,下面我有一个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样式转换(或重新解释转换)应始终按照我的预期进行,对吧?

1 个答案:

答案 0 :(得分:3)

  

下面的“transpose()”方法试图在不执行复制的情况下转置对象,只需返回对自身的引用但转换后的标记已反转。

这是不可能的。

对于transposed(布尔值)的任何值,Transposable_matrix<true>Transposable_matrix<false>是两种不同且不兼容的类型。使用static_cast无法将其转换为另一个。