template<typename TElementType, typename TSfinae = void>
struct Product

Adapter for the product of two elements.

Defined in adapters.hpp.

Specialisations of this struct should be stateless trivially default constructible with a call operator of signature void operator()(TElementType& xy, TElementType const& x, TElementType const& y, size_t = 0) (possibly noexcept, inline and/or constexpr also).

The call operator should change xy in-place to be the product of x and y. The 4th parameter is optional and it can be used as an index for static thread local storage, that might be required for forming the product of x and y. The purpose of the 1st parameter is to avoid repeated allocations of memory to hold temporary products that are discarded soon after they are created.

Used by:


template <>
struct Product<size_t> {
  void operator()(size_t& xy, size_t x, size_t y, size_t = 0) const
  noexcept {
    xy = x * y;

Template Parameters
  • TElementType – the type of the elements of a semigroup.

  • TSfinae – this template parameter can be used for SFINAE.