#include<iostream>
#include<type_traits>
#include<cstdio>
#include<concepts> // c++20

struct A {
  bool operator == (A const &);
  int operator * (int factor) {
    return m * factor;
  }
  int m;
};
template<typename T1, typename T2>
concept CanMultiply = requires(T1 & a, T2 & b) {
  a * b;
};
template<typename T1, typename T2> requires CanMultiply<T1, T2>
void mul(T1 & t1, T2 & t2) {
    t1.m = t1 * t2;
}

int main() {
  A a = { 2 };
  int b = 10;
  mul( a, b );
  fprintf(stdout, "a: %d\n", a.m);
  return 0;
}
// usage: clang++ -std=c++20 -Weverything -O3 .\concepts_check_mul_op.cpp && .\a.exe