#include <iostream>

template<typename T, typename U>
decltype(T() + U()) add(T a, U b)
{
    return a + b;
};

template<class T1, class T2>
decltype(T1() * T2()) f(T1 v1[], T2 v2[], size_t count) // Will not compile!
{
    decltype(v1[0]*v2[0]) sum(0);
    for(size_t i = 0; i<count; i++) sum += v1[i]*v2[i];
    return sum;
};

int main()
{
    int i = 9;
    int ia[] = {1,2,3,4,5};
    double da[] = {1.0,2.0,3.0,4.0,5.0};
    
    double d = 2.0;
    
    auto a = add<int, double>(i,d);
    auto a2 = f<int,double>(ia,da, 5);
    
    std::cout << a << std::endl;
    std::cout << a2 << std::endl;
}