#include <array>
#include <iostream>
#include <vector>
constexpr std::array<double, 5> p = { 1.0, 0.0, 3.0, 5.0, 0.0 };
template<size_t index, bool isZero>
struct DotProductCalculator
{
static double Calculate(const std::vector<double>& xArg)
{
return (xArg[index] * p[index])
+ DotProductCalculator<index - 1, p[index - 1] == 0.0>::Calculate(xArg);
}
};
template<>
struct DotProductCalculator<0, true>
{
static double Calculate(const std::vector<double>& xArg)
{
return 0.0;
}
};
template<>
struct DotProductCalculator<0, false>
{
static double Calculate(const std::vector<double>& xArg)
{
return xArg[0] * p[0];
}
};
template<size_t index>
struct DotProductCalculator<index, true>
{
static double Calculate(const std::vector<double>& xArg)
{
return 0.0 + DotProductCalculator<index - 1, p[index - 1] == 0.0>::Calculate(xArg);
}
};
template<typename ArrayType>
double f_p_driver(const std::vector<double>& xArg, const ArrayType& pAsArgument)
{
return DotProductCalculator<std::tuple_size<ArrayType>::value - 1,
p[std::tuple_size<ArrayType>::value -1] == 0.0>::Calculate(xArg);
}
int main()
{
std::vector<double> x = { 1.0, 2.0, 3.0, 4.0, 5.0 };
double result = f_p_driver(x, p);
std::cout << "Result: " << result;
return 0;
}
CiNpbmNsdWRlIDxhcnJheT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKY29uc3RleHByIHN0ZDo6YXJyYXk8ZG91YmxlLCA1PiBwID0geyAxLjAsIDAuMCwgMy4wLCA1LjAsIDAuMCB9OwoKdGVtcGxhdGU8c2l6ZV90IGluZGV4LCBib29sIGlzWmVybz4Kc3RydWN0IERvdFByb2R1Y3RDYWxjdWxhdG9yCnsKCXN0YXRpYyBkb3VibGUgQ2FsY3VsYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHhBcmcpCgl7CgkJcmV0dXJuICh4QXJnW2luZGV4XSAqIHBbaW5kZXhdKSAKCQkJCSsgRG90UHJvZHVjdENhbGN1bGF0b3I8aW5kZXggLSAxLCBwW2luZGV4IC0gMV0gPT0gMC4wPjo6Q2FsY3VsYXRlKHhBcmcpOwoJfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgRG90UHJvZHVjdENhbGN1bGF0b3I8MCwgdHJ1ZT4KewoJc3RhdGljIGRvdWJsZSBDYWxjdWxhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgeEFyZykKCXsKCQlyZXR1cm4gMC4wOwoJfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgRG90UHJvZHVjdENhbGN1bGF0b3I8MCwgZmFsc2U+CnsKCXN0YXRpYyBkb3VibGUgQ2FsY3VsYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHhBcmcpCgl7CgkJcmV0dXJuIHhBcmdbMF0gKiBwWzBdOwoJfQp9OwoKdGVtcGxhdGU8c2l6ZV90IGluZGV4PgpzdHJ1Y3QgRG90UHJvZHVjdENhbGN1bGF0b3I8aW5kZXgsIHRydWU+CnsKCXN0YXRpYyBkb3VibGUgQ2FsY3VsYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHhBcmcpCgl7CgkJcmV0dXJuIDAuMCArIERvdFByb2R1Y3RDYWxjdWxhdG9yPGluZGV4IC0gMSwgcFtpbmRleCAtIDFdID09IDAuMD46OkNhbGN1bGF0ZSh4QXJnKTsKCX0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIEFycmF5VHlwZT4KZG91YmxlIGZfcF9kcml2ZXIoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgeEFyZywgY29uc3QgQXJyYXlUeXBlJiBwQXNBcmd1bWVudCkgCnsKICAgICByZXR1cm4gRG90UHJvZHVjdENhbGN1bGF0b3I8c3RkOjp0dXBsZV9zaXplPEFycmF5VHlwZT46OnZhbHVlIC0gMSwgCiAgICAgCQkJCQkJCXBbc3RkOjp0dXBsZV9zaXplPEFycmF5VHlwZT46OnZhbHVlIC0xXSA9PSAwLjA+OjpDYWxjdWxhdGUoeEFyZyk7IAp9CgppbnQgbWFpbigpIAp7CglzdGQ6OnZlY3Rvcjxkb3VibGU+IHggPSB7IDEuMCwgMi4wLCAzLjAsIDQuMCwgNS4wIH07Cglkb3VibGUgcmVzdWx0ID0gZl9wX2RyaXZlcih4LCBwKTsKCXN0ZDo6Y291dCA8PCAiUmVzdWx0OiAiIDw8IHJlc3VsdDsKCXJldHVybiAwOwp9