有没有办法在使用C++ 11的函数调用期间自动将`vector <int>`推广到`vector <double>`?

mer*_*011 9 c++ c++11

如果我定义一个带有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)是有效的,并按预期行事?

Bor*_*der 7

你实际上不必指定它(编译器将通过@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)

实例

应该注意的是,标准库包含一个已经执行此操作的功能:累积