Templaty

0

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;
}
2

can_add jest templatem, który przyjmuje 3 parametry, z czego ostatni jest defaultem (void). Dalej masz częściową specjalizację tego szablonu, gdzie ostatni parametr to void_t<decltype(std::declval<A>() + std::declval<B>())>. Sam void_t to templatowy alias, który dla dowolnych, zadanych typów zwraca void. void_t<decltype(std::declval<A>() + std::declval<B>())> w zależności od tego, czy wyrażenie decltype(std::declval<A>() + std::declval<B>()) jest prawdziwe wybierze tę specjalizację template albo (w przeciwnym wypadku) via SFINAE wywoła bazowy template.

1 użytkowników online, w tym zalogowanych: 0, gości: 1