gpt4 book ai didi

C++模板参数赋值推导

转载 作者:搜寻专家 更新时间:2023-10-31 00:31:06 24 4
gpt4 key购买 nike

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

具体来说,让我们考虑一个创建 MatType<T> 类型随机矩阵的函数一定维度的。模板参数 T 是矩阵的数值类型(例如 double 、 float 、整数等矩阵):

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com