Как реализовать произведение времени компиляции двух векторов в C ++ - PullRequest
1 голос
/ 11 марта 2020

Скалярное произведение двух векторов с размером 'N', определенным как SP (a, b) = a_1 * b_1 + ... + a_N * b_N.

Целочисленный вектор времени компиляции, определенный как:

template<int... I>
struct Vector;

Интерфейс продукта функции:

template<typename Vector1, typename Vector2>
constexpr int product

Например, для теста можно использовать следующий код:

static_assert(product<Vector<1, 2, 5>, Vector<1, 3, 4>> == 27);

Как реализовать продукт, чтобы соответствовать утверждению а интерфейс выше?

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

С C ++ 17 складывания

template <int...>
struct Vector
 { };

template <typename, typename>
constexpr int product = -1;

template <int ... Is, int ... Js>
constexpr int product<Vector<Is...>, Vector<Js...>> = (... + (Is*Js));

int main ()
 {
   static_assert(product<Vector<1, 2, 5>, Vector<1, 3, 4>> == 27);
 }
2 голосов
/ 11 марта 2020

Может быть, что-то вроде этого:

template<int ... >
struct Vector{};

template<int ... Idx1, int ... Idx2>
constexpr int product(Vector<Idx1...>, Vector<Idx2...>) {
    static_assert(sizeof...(Idx1) == sizeof...(Idx2), "Product cannot be calculated, dims dismatched");
    int res = 0;
    int temp [] = { (res +=  (Idx1 * Idx2),0)...};
    static_cast<void>(temp);
    return res;
}

int main() {
    static_assert(product(Vector<1,2,5>{},Vector<1,3,4>{}) == 27);
}

Живая демоверсия

...