Ogólnie to wygląda jak trochę starsza metoda robienia SFINAE z enable_if w C++11.
// Czemu tutaj występuje typename i czy T::type jest jakąś zmienną w klasie T?
template<typename T>
using Invoke = typename T::type;
To jest alias template. Zgodnie z intuicją: dla typu T, Invoke<T> to typ T::type.
Drugi `typename` jest potrzebny, ponieważ... w sumie najlepiej podpowie kompilator, gdy tego nie dasz :)
<source>:5:16: error: need 'typename' before 'T::type' because 'T' is a dependent scope
5 | using Invoke = T::type;
| ^
| typename
//W jaki sposób to wyrażenie wiąże się z poprzednim
//T::type<std::enable_if<Condition::value>>;??
Na odwrót. To jest równoważne z
std::enable_if<Condition::value>>::type
//Co oznacza przypisanie czegoś do typename w takiej formie??
To jest analogiczne do domyślnych argumentów funkcji:
void f(int argument, int = 5) // w deklaracji mozesz nie nazwac argumentu, ale mozesz dac mu wartosc domyslna
ten argument Cię nie interesuje, interesuje tylko sama obecność tego enable_if żeby potencjalnie zaskoczyło SFINAE.
W każdym razie... ogólnie ta złożoność została schowana w bibliotekę standardową.
Teraz możesz napisać:
// c++14
template<typename T, typename = std::enable_if_t<std::is_polymorphic<T>::value>>
// c++17
template<typename T, typename = std::enable_if_t<std::is_polymorphic_v<T>>>