c++ - c++ 函数原型中的模板参数推导。在这种情况下可能的解决方法?
问题描述
底漆
我有一Vector
门数学课。除其他外,它具有mean()
计算向量内所有值的平均值的函数。它使用sum()
我在此处添加的功能,只是为了完整性。
Vector
template <std::size_t N, typename T>
class Vector{
public:
// ...
T sum() const {
T ret{};
for (const auto &item : data) {
ret += item;
}
return ret;
}
template <typename U = T>
U mean() const {
return U(sum()) / N;
}
private:
std::array<T,N> data;
};
函数本身有一个模板参数,因此该mean()
函数的调用者可以选择指定他想要其结果的类型。例如,如果Vector
是 type int
,则如果将平均值强制转换为该类型,则可能会导致精度损失的Vector
,在这种情况下int
:
Vector<3,int> vec{2,3,5};
int mean1 = vec.mean();
int mean2 = vec.mean<int>(); // same as mean1
float mean3 = vec.mean<float>();
正如预期的那样,这些值为
3
3
3.333333f
这一切都很好。这里没问题。
问题
我遇到的问题是当我想用一个自由函数(在课堂之外)实现同样的目标。我的第一个天真的实现是这样的
template <std::size_t N, class T>
T mean(const Vector<N, T> &other) {
return other.mean();
}
但是当试图计算float
平均值时,我必须总是调用这个自由函数,同时指定模板参数N
和T
。
Vector<3,int> vec{2,3,5};
float mean = mean<3, float>(vec);
// ^^^i want to get rid of this "3"
问题
我知道模板参数推导在函数原型中不起作用......而且如果N
不准确指定它,可能无法以某种方式推导参数。N
但是也许有一个完全不相关的解决方法来消除在调用我看不到的自由函数时必须写出值的需要?
解决方案
我知道模板参数推导在函数原型中不起作用......并且可能没有办法以某种方式扣除参数 N 而不准确指定它。
什么?
但是也许有一个完全不相关的解决方法来消除在调用我看不到的自由函数时必须写出 N 值的需要?
如下呢?
template <typename U, std::size_t N, typename T>
U mean(const Vector<N, T> &other) {
return other.template mean<U>();
}
你可以打电话
Vector<3,int> vec{2,3,5};
mean<float>(vec);
所以3
和int
被推导出来,你只表达返回的类型 ( float
)。
推荐阅读
- python - Python .cgi 脚本 - 动态创建 HTML 按钮 - 无法传递 onclick 函数参数
- c - 查找数组中出现次数最多的数字
- dialogflow-es - DialogFlow Conv 将用户状态显示为访客
- java - 如何将图像插入哈希图中
- json - Spark:为 JSON 字符串生成 JSON 模式
- node.js - 如何找到 HTTPS 请求库的 TLS 版本?
- flutter - Flutter:应用程序的 AndroidManifest.xml 中的位置包错误元数据标记不存在
- javascript - 找到数组中最大的 d 使得 a + b + c = d
- python - Django 嵌套模板标签
- c - Yacc Yytext 被覆盖?