C++ 模板参数通过赋值推导

标签 c++ templates matrix

我想要一些非常简单的东西:一个模板函数,它仅在返回类型中包含模板参数,但不在函数参数中。然后,在调用函数时,应从赋值中推导出模板参数。

具体来说,让我们考虑一个创建 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/

相关文章:

c++ - 按 myvector[i][0] 排序 vector

java - 如何在 2d ArrayList 中找到对角线元素的总和?

python - 每行 Numpy 中二维矩阵的滚动窗口或事件?

c++ - Boost Json 写入错误:没有匹配函数来调用‘boost::property_tree::basic_ptree<std::__cxx11

c++ - C++11 中的隐式构造函数参数转换

c++ - 模板中的数据类型错误

不同文件之间二维矩阵的c++下标运算符

R:如何在列表中应用求和函数?

c++ - 如何确保只有 1 个互斥量?

c++ - 在没有模板化类的情况下存储 lambda