#include <array>
#include <iostream>
#include <numeric>
#include <type_traits>
#include <utility>
template <typename T, typename U>
using ProductType = decltype(std::declval<T>() * std::declval<U>());
template <size_t N, typename T = double>
using Vector = std::array<T,N>;
template <size_t N, typename T, typename U>
ProductType<T,U> dotproduct(const Vector<N, T>& t, const Vector<N, U>& u)
{
return std::inner_product(t.begin(), t.end(), u.begin(), ProductType<T,U>());
}
int main()
{
const Vector<3, short> v1 { 1, 2, 3 };
const Vector<3, signed char> v2 { 1, 2, 3 };
auto res = dotproduct(v1, v2);
static_assert(std::is_same<int, decltype(res)>::value, "Unxpected return type");
std::cout << res << std::endl;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx1dGlsaXR5PgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CnVzaW5nIFByb2R1Y3RUeXBlID0gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPFQ+KCkgKiBzdGQ6OmRlY2x2YWw8VT4oKSk7Cgp0ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIFQgPSBkb3VibGU+CnVzaW5nIFZlY3RvciA9IHN0ZDo6YXJyYXk8VCxOPjsKCnRlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KUHJvZHVjdFR5cGU8VCxVPiBkb3Rwcm9kdWN0KGNvbnN0IFZlY3RvcjxOLCBUPiYgdCwgY29uc3QgVmVjdG9yPE4sIFU+JiB1KQp7CiAgcmV0dXJuIHN0ZDo6aW5uZXJfcHJvZHVjdCh0LmJlZ2luKCksIHQuZW5kKCksIHUuYmVnaW4oKSwgUHJvZHVjdFR5cGU8VCxVPigpKTsKfQoKaW50IG1haW4oKQp7CiAgY29uc3QgVmVjdG9yPDMsIHNob3J0PiB2MSB7IDEsIDIsIDMgfTsKICBjb25zdCBWZWN0b3I8Mywgc2lnbmVkIGNoYXI+IHYyIHsgMSwgMiwgMyB9OwogIGF1dG8gcmVzID0gZG90cHJvZHVjdCh2MSwgdjIpOwoKICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxpbnQsIGRlY2x0eXBlKHJlcyk+Ojp2YWx1ZSwgIlVueHBlY3RlZCByZXR1cm4gdHlwZSIpOwoKICBzdGQ6OmNvdXQgPDwgcmVzIDw8IHN0ZDo6ZW5kbDsKfQ==