我想要一些非常简单的东西:一个模板函数,它仅在返回类型中包含模板参数,但不在函数参数中。然后,在调用函数时,应从赋值中推导出模板参数。
具体来说,让我们考虑一个创建 MatType<T>
类型随机矩阵的函数具有一定的维度。模板参数 T 是矩阵的数字类型(例如 double 型、浮点型、整数型等矩阵):
template<typename T>
MatType<T>
randmat(int m, int n)
{ // create MatType<T> of size m x n, fill with random numbers and return it.}
现在由于某种原因,模板参数无法从返回类型中推导出来,因此当我使用此函数时,我必须将其调用为例如
MatType<double> M = randmat<double>(10,10);
但是我想要解决这个问题的方法,即调用函数就像
MatType<double> M = randmat(10,10);
即让函数根据返回类型 MatType<double>
确定模板参数。
这部分是因为我很懒,因为我的例子中的模板参数可能会变得又长又讨厌。
这似乎是一个很多人以前问过的愚蠢问题,但除了说这是不可能的之外,我并没有真正找到任何令人满意的答案。然而,我正在使用一个名为 armadillo 的矩阵库,其模板函数恰好为 that ability ,所以我知道这是可能的(但对于我来说,从源代码中提取它是如何完成的有点太复杂和耗时)。
这可以通过某些特征或模板元编程来完成吗?另外,如何处理没有赋值的函数调用,如randmat(10,10);
?
谢谢
最佳答案
更有效地实现此效果的一种方法是推迟随机值的计算,直到知道返回类型为止。您可以使用代理对象来实现此目的,该代理对象的唯一目的是检测分配给的类型,然后使用类型适当的对象执行计算。
struct RandMatType {
const int m_;
const int n_;
RandMatType (int m, int n) : m_(m), n_(n) {}
template <typename T>
operator MatType<T> () const {
MatType<T> M;
//... fill M
return M;
}
};
RandMatType randmat(int m, int n) {
return RandMatType(m, n);
}
在上面的代码中,randmat()
首先返回RandMatType
类型的代理。然后,在赋值期间,代理对象被转换为目标类型。然后,转换运算符假定转换类型是要使用的矩阵类型。
关于C++ 模板参数通过赋值推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34869204/