【发布时间】:2022-01-17 06:29:54
【问题描述】:
我觉得这可能是一个初级问题,但经过相当多的搜索后我找不到简单的答案,所以我想我会问。
我有一个函数旨在返回容器中的第 n 个百分位值,但由于遗留原因,该数组可以是向量或 valarray,它可以包含双精度数或浮点数。该函数的正确语法是什么? 目前我有:
template <template <class> class vType, class elType>
elType GetPercentile(vType<elType>& vData, double dPercentile)
{
int iOffset = int(dPercentile * vData.size());
std::nth_element(begin(vData), begin(vData) + iOffset, end(vData));
return static_cast<elType>(vData[iOffset]);
}
这在传递一个 valarray 时编译正常,但对于一个向量失败:
'elType GetPercentile(vType &,double)': 无法从 'std::vector
' 推导出 'vType &' 的模板参数
有没有办法做到这一点?复制这两种容器类型的代码似乎很愚蠢。 (如果代码本身有任何 cmets,那也可以。)
非常感谢您的任何建议。 比尔H
【问题讨论】:
-
对我来说,此代码适用于
std::vector>。您使用的是哪个编译器?哪个c++版本?我使用 gcc,C++17。 -
vector有两个模板参数,其中一个是默认的。您可能需要选择一个相当新的标准来支持它来匹配
template <class> class vType而不仅仅是template <class, class> class vType。 -
template <class, class...> class vType应该在 c++11 及更高版本中工作。如答案中所示,这个特定问题允许更简单的解决方案,但是当您确实需要模板模板参数时,这就是您在 c++17 之前的方式。
标签: c++ templates vector valarray