模板:如何泛化输入以接收整数、双精度或特定(模板)容器的向量
Templates: how to generalize input to receive vector of ints, doubles or specific (template) container?
我正在通过《使用C++的原则与实践》一书来学习C++,并对一个练习有一个问题。它建议通过模板编写一个Number
类来保存一个数字并重载其运算符。接下来,它建议使用一个同样模板化的函数来求和 2 个不同类型的向量(int
+ double
或 Number(int)
+ Number(double)
)。
我当前的代码如下:
#include <iostream>
#include <vector>
using namespace std;
template<class T> class Number{
T value;
public:
Number() : value(T()) { }
Number(T n) : value(n) { }
Number(const Number& a) : value(a.value) { }
T get() const {return value;};
};
template<class T, class U>
Number<typename std::common_type<T,U>::type>
operator+(const Number<T>& a, const Number<U>& b)
{
return Number<typename std::common_type<T,U>::type>(a.get() + b.get());
}
template<class T, class U>
Number<typename std::common_type<T,U>::type>
operator*(const Number<T>& a, const Number<U>& b)
{
return Number<typename std::common_type<T,U>::type>(a.get() * b.get());
}
template<class T, class U>
typename std::common_type<T,U>::type
sumProductOfVectors(vector<T>& vt, vector<U>& vu){
typename std::common_type<T,U>::type sum = 0;
if(vt.size() != vu.size() )
return sum;
for (int i = 0; i< vt.size(); i++)
{
sum += vt.at(i)*vu.at(i);
}
return sum;
}
int main(int argc, const char * argv[]) {
vector<Number<int>> vni;
vni.push_back(Number<int>(1));
vni.push_back(Number<int>(2));
vni.push_back(Number<int>(3));
vector<Number<double>> vnd;
vnd.push_back(Number<double>(1));
vnd.push_back(Number<double>(2));
vnd.push_back(Number<double>(3));
vector<int> vi = {1,2,3};
vector<double> vd = {1,2,3};
sumProductOfVectors<int,double>(vi,vd);
// sumProductOfVectors<int,double>(vni,vnd); // Does not accept
}
虽然对产品求和的函数适用于标准向量,但我很难让它也接受Numbers
.在当前形式中,编译器指示对函数sumProductOfVectors
的不匹配调用,当其中一个参数来自类 Number
时。
如何使它接受vector<int>
、vector<double>
、vector<Number<int>>
和vector<Number<double>>
的所有类型的组合?
这种过于复杂的解决方案,还是为此类问题使用单独的函数会更合适并且是更好的编程实践?
编辑:减少代码以提高可读性
为了更通用,您的sumProductOfVectors
可能如下所示:
template<class T, class U>
auto
sumProductOfVectors(const std::vector<T>& vt, const std::vector<U>& vu)
{
decltype(vt[0] + vu[0]) sum{};
if (vt.size() != vu.size()) {
return sum;
}
// return std::inner_product(vt.begin(), vt.end(), vu.begin(), sum);
for (std::size_t i = 0; i != vt.size(); ++i) {
sum = sum + vt.at(i) * vu.at(i);
}
return sum;
}
演示
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C++ 具有双精度和长双精度的显式模板实例化
- 将不同类型的模板参数包提取到双精度向量中会产生警告
- C++采用浮点数或双精度的模板函数
- C++双精度作为模板参数的解决方法
- 双精度/整数模板函数的向量
- 模板:如何泛化输入以接收整数、双精度或特定(模板)容器的向量
- 使用整数模板参数创建编译时双精度
- 在模板运算符*中将 int 隐式转换为双精度<>
- 如何静态检查模板的类型 T 是否为 std::vector<U>,其中 U 是浮点数、双精度数或积分
- 如何替换具有双精度类型的模板参数
- 运算符重载=和模板双精度值不仅对int起作用
- 从模板函数返回双精度或复数<double>
- 生成随机整型和双精度的c++模板类