等价参数的c++函数专门化
C++ function specialization for equal parameters
我和其他许多人一样,正在为我个人编写一个线性代数库。在这样做的过程中,我试图学习更多关于在c++中使用模板编程的知识。我有一个类,类似于
template<typename T, size_t N, size_t M = N>
class Matrix
{
...
}
现在,我想将某些运算限制在方阵中(例如行列式)。但是当我尝试添加:
T Determinant<T,N,N>();
编译失败,错误提示"<'前缺少';'"。我试过在行列式调用上方添加另一个模板,没有任何成功。如能提供任何建议,我将不胜感激。
不幸的是,您不能像这样为特定的模板参数专门化函数,您必须对整个类进行专门化。因为你不想重写整个代码,你可能想使用继承。
//shared code
template<typename T, size_t N, size_t M>
class BaseMatrix
{
//existing code
};
// non-square general case
template<typename T, size_t N, size_t M=N>
class Matrix : public BaseMatrix<T,N,M>
{
//forwarding headers
Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {}
};
//square matrix specialization
template<typename T, size_t N>
class Matrix : public BaseMatrix<T,N,N>
{
//forwarding headers
Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {}
T Determinant();
};
现在,我想将某些运算限制在方阵中(例如行列式)。
你是指这样的自由函数吗?
template< typename T, std::size_t N >
T determinant( Matrix< T, N, N > const& m ){ ... }
或者你指的是类成员吗?如果您需要一个类成员,那么您最好将所有通用功能移到基类中,并在Matrix
上使用模板专门化来包含方阵的额外功能。
我支持基类的想法。有一个Matrix类和一个SquareMatrix子类。在SquareMatrix类中声明行列式方法,并安全地假设矩阵是方形的,而不必处理模板。行列式方法会更简单,调用它的代码也会更简单。
必须像这样声明一个变量:Matrix<float, 10, 10> myMatrix;
.
相关文章:
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 专门化模板覆盖函数/避免对象切片
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 如何在编译时专门化大型模板函数中的小部分
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 从 std 命名空间中专门化函数模板的想法有多糟糕?
- 为模板函数专门化一个模板类
- 基于参数值的c++模板成员函数专门化
- 如何确定函数专门化的主模板
- 等价参数的c++函数专门化
- 基于运行时值调用不同的模板函数专门化
- 跨库的模板函数专门化符号匹配
- 模板函数专门化,c++
- 如何使用type_traits或模板函数专门化来整合模板方法
- 如何在子类中重载模板化函数(专门化)
- 可变模板函数:专门化头/尾和空基准情况
- 不允许void的部分函数专门化-替代解决方案