Scalar produkt dwóch wektorów z wielkością "n" zdefiniowaną jako sp (a, b) = a_1 * b_1 + ... + a_n * b_n.
Wektor liczby całkowitej kompilacji zdefiniowane jako:
template<int... I>
struct Vector;
Funkcja Interfejs produktu:
template<typename Vector1, typename Vector2>
constexpr int product
Na przykład do testu można zastosować następujący kod:
static_assert(product<Vector<1, 2, 5>, Vector<1, 3, 4>> == 27);
W jaki sposób produkt może być zaimplementowany, aby dopasować się do Assertu i interfejsu powyżej?
2 odpowiedzi
Może coś takiego:
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);
}
Z Składanką 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);
}
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .