Hej. Trafiłem na taki kawałek kodu, czy ktoś jest w stanie mi wytłumaczyć jak działa can_add? Tzn. za co odpowiada trzeci typename i po co on w ogóle tam jest, i do czego jest void_t.
#include <type_traits>
template<typename...>
using void_t = void;
template<typename, typename, typename = void>
struct can_add : std::false_type {};
template<typename A, typename B>
struct can_add<A, B,
void_t<decltype(std::declval<A>() + std::declval<B>())>
> : std::true_type {};
template<typename A, typename B>
auto add(A a, B b) {
static_assert(can_add<A, B>::value, "Cannot add! You must send types that can add together.");
return a + b;
}