如果我定义一个带有a的函数double,我通常可以用它来调用它int并获得正确的行为.
double square(double d) {
return d * d;
}
square(1); // valid call
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一个函数,则vector<double>调用它是无效的vector<int>
double sum(const vector<double>& d) {
double s = 0;
for (int i = 0; i < d.size(); i++)
s += d[i];
return s;
}
vector<int> f(1,5);
sum(f); // Compiler error
Run Code Online (Sandbox Code Playgroud)
一个解决方案是使用模板:
template<typename T>
double tsum(const vector<T>& d) {
double s = 0;
for (int i = 0; i < d.size(); i++)
s += d[i];
return s;
}
vector<int> f(1,5);
tsum<int>(f); // Valid
Run Code Online (Sandbox Code Playgroud)
然而,在这种情况下,我们必须指定类型的功能,这是一个有点笨拙的一部分,尤其是如果我想定义一个dot产品的功能,它可以做数字类型的任意组合,这样的点积vector<int>和vector<double>和vector<float>,因为现在每次调用此函数时,调用者都必须明确指定哪个向量是哪个特定的数字类型.
有没有办法定义一个函数,使用传统或新的c++,这样的调用
sum(f)是有效的,并按预期行事?
你实际上不必指定它(编译器将通过@FredOverflow在评论中提到的所谓的模板参数推导"找到它"):
#include <iostream>
#include <vector>
template<typename T>
T tsum(std::vector<T> const& d)
{
T s = 0;
for(auto x : d) { s += x; }
return s;
}
int main()
{
std::vector<int> f(1,5);
tsum(f);
std::vector<double> v(2, 6);
tsum(v);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
应该注意的是,标准库包含一个已经执行此操作的功能:累积