C++ 铸造模板值参数

C++ 铸造模板值参数,c++,templates,casting,C++,Templates,Casting,我有一个模板类,它有一个布尔模板参数。是否有合法的方法将其强制转换为对同一对象的引用,但布尔值是反向的 作为一个示例,下面我有一个矩阵类,它的转置可以由相同的对象数据表示,但“转置”模板参数是反向的 template <bool transposed> class Transposable_matrix { ... Transposable_matrix<!transposed>& transpose() { static_

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

作为一个示例,下面我有一个矩阵类,它的转置可以由相同的对象数据表示,但“转置”模板参数是反向的

template <bool transposed>
class Transposable_matrix
{
    ...
    Transposable_matrix<!transposed>& transpose()
    {
        static_cast<Transposable_matrix<!transposed>& >(*this);
    }
};
模板
类转置矩阵
{
...
转置矩阵&转置()
{
静态施法(*本);
}
};
上面的“transpose()”方法尝试在不执行复制的情况下对对象进行转置,方法是简单地返回对对象本身的引用,但转置标志被反转。然而,可能毫不奇怪,cast操作在编译时失败。有没有一种可以接受的方法?我猜reinterpret_cast不能保证正确性。我可以使用代理对象来表示转置的对象,但这将涉及重构整个类

编辑

在使用reinterpret cast之后,我的所有单元测试都通过了。但是,重新解释演员阵容让我感到紧张——这是否属于“未定义行为”的范畴,而我只是运气好?或者因为这两种类型(
Matrix
Matrix
)的成员相同,我应该安全吗

编辑2 注意这个类没有虚方法会有帮助吗?所以,看起来数据成员的逐位拷贝应该是有效的,而不管转置状态如何,所以c样式转换(或重新解释转换)应该总是按照我的预期进行,对吗

下面的“transpose()”方法尝试在不执行复制的情况下对对象进行转置,方法是简单地返回对对象本身的引用,但转置标志被反转

这是不可能的

对于
转置
(布尔值)的任何值,
转置矩阵
转置矩阵
是两种不同且不兼容的类型。不能使用
static\u cast
将一个强制转换为另一个

下面的“transpose()”方法尝试在不执行复制的情况下对对象进行转置,方法是简单地返回对对象本身的引用,但转置标志被反转

这是不可能的


对于
转置
(布尔值)的任何值,
转置矩阵
转置矩阵
是两种不同且不兼容的类型。如果您想在运行时更改“类型”,我认为模板参数在任何方面都没有用处。它允许我对矩阵运算执行编译时维度检查,这实际上非常有用。我可以在编译时知道矩阵乘法结果的维数,这允许我在堆栈而不是堆上分配结果——这对我的应用程序来说是一个巨大的胜利。在上面的示例中,我可以使用reinterpret cast来完成它,我只是想知道这是否是未定义的行为。这取决于类包含的内容,但是如果您可以按值返回实例会更好。我真的无法想象
Matrix obj的含义是什么;矩阵&ref=a.转置()
原始的
obj
仍然存在,但它被转置了,尽管类型中另有说明??原始obj未被修改,ref是转置形式的obj“视图”,对其进行的所有操作都将简单地颠倒其索引顺序。例如,对于所有i,j,obj(i,j)=ref(j,i)和&obj(i,j)==&ref(j,i)。和ref(i,j)=1234;assert(obj(j,i)==1234)。此外,它还允许您将赋值转换为Matlab风格的转置版本:mat_2x3.transpose()=mat_3x2;如果您想在运行时更改“类型”,我认为模板参数在任何方面都没有用处。它允许我对矩阵运算进行编译时维度检查,这实际上非常有用。我可以在编译时知道矩阵乘法结果的维数,这允许我在堆栈而不是堆上分配结果——这对我的应用程序来说是一个巨大的胜利。在上面的示例中,我可以使用reinterpret cast来完成它,我只是想知道这是否是未定义的行为。这取决于类包含的内容,但是如果您可以按值返回实例会更好。我真的无法想象
Matrix obj的含义是什么;矩阵&ref=a.转置()
原始的
obj
仍然存在,但它被转置了,尽管类型中另有说明??原始obj未被修改,ref是转置形式的obj“视图”,对其进行的所有操作都将简单地颠倒其索引顺序。例如,对于所有i,j,obj(i,j)=ref(j,i)和&obj(i,j)==&ref(j,i)。和ref(i,j)=1234;assert(obj(j,i)==1234)。此外,它还允许您将赋值转换为Matlab风格的转置版本:mat_2x3.transpose()=mat_3x2;这在按值返回时是不可能的。正如我所说:“但是,可能并不奇怪,强制转换操作在编译时失败。”我想知道是否有一种安全的方法可以使用不安全的强制转换来实现这一点,因为我知道数据字段和方法是相同的。如我所说:“然而,可能毫不奇怪,cast操作在编译时失败。”我想知道是否有一种安全的方法来处理不安全的cast,因为我知道数据字段和方法是相同的。