mogę być typu tak:warunkowego definicja typu alias
template<typename T>
struct wrapper
{
using foo = typename T::foo;
using bar = typename T::bar;
using baz = typename T::baz;
// More of those...
};
ja jak foo
, bar
, baz
i równoważne typu aliasy być określone tylko wtedy, gdy odpowiednik typu istnieje T
. Rozwiązania używające std::conditional
pozwalają zastąpić je czymś innym, gdy nie istnieje, ale nie wiem, jak upewnić się, że nie istnieje, gdy odpowiedni typ nie istnieje w typie szablonu. Powyższy kod powoduje błąd podczas tworzenia instancji wrapper<T>
, jeśli T
nie definiuje jednego z aliasów typów.
nie mogę zrobić wrapper
Dziedzicz T
ponieważ wrapper
nie ma robić wszystko T
może zrobić. Ponadto, zastosowanie częściowej specjalizacji prowadziłoby do pewnego rodzaju eksplozji eksplozji i szybko stałoby się nieosiągalne. Pewnie mógłby foo
, bar
... szablonów aliasy typu do wstrzykiwania std::enable_if
w parametrze szablonu domyślnego, ale potem użytkownicy będą musieli napisać wrapper<T>::foo<>
, wrapper<T>::bar<>
zamiast wrapper<T>::foo
, wrapper<T>::bar
, itp ... i nie chcę tego.
Czy istnieje prosty, ale obsługiwany sposób definiowania takiego aliasu typów tylko wtedy, gdy odpowiedni alias typu istnieje w T
?
To było rozwiązanie, które miałem na myśli i byłem gotowy na wypróbowanie go. To nie jest ładne, ale jeszcze bardziej możliwe do utrzymania niż inne rozwiązania bez narażania użytkowników na niepotrzebne rzeczy. Dzięki :) – Morwenn
Dang. Miałem nadzieję, że będzie lepsze rozwiązanie niż to. – Justin