Próbuję zrozumieć przydatność static_assert
i chcę wiedzieć, czy może mi pomóc w egzekwowaniu projekt, a jeśli tak, to w jaki sposób.Wymuszanie typ szablonu poprzez static_assert
Mam ogólną klasę szablonu, który ukrywa swoją własną implementację wewnątrz innej klasy szablonu, który jest częściowo specjalizującej się w zależności od wielkości, typu szablonu. Oto krótki zarys tego projektu:
template <class T, size_t S = sizeof(T)>
struct Helper;
template <class T>
struct Helper<T, sizeof(long)>
{
static T bar();
};
// ... other specializations ...
template <class T>
class Foo
{
public:
T bar()
{
return Helper<T>::bar();
}
};
Foo jest obsługiwana tylko wtedy, gdy wielkość T
jest wspierany przez specjalizacji Helper. Obsługiwane są na przykład Foo<long>
i Foo<unsigned long>
. Załóżmy jednak, że użytkownik próbuje zbudować model Foo<bool>
. Zazwyczaj będzie to generować błędy, ponieważ specjalizacja Helper dla bool
nie jest zdefiniowany, który jest przeznaczony zachowanie.
Czy jest jakiś sposób na wykorzystanie static_assert
w tej konstrukcji w celu zapewnienia bardziej pomocny błędy użytkownikowi tego interfejsu?
Dodatkowo chciałbym również restric użytkownikowi korzystanie z konkretnego rodzaju, mimo że wielkość może być prawidłowa. Na przykład: Foo<float>
nie powinno być dozwolone. W tej chwili jedynym sposobem, w jaki wiem o egzekwowaniu tego jest odważny komentarz w dokumentacji. :)
Myśleć bardziej ogólnie, czy to tylko typy liczb całkowitych, które są obsługiwane? Nie 'char',' bool', 'float', et al? – Rapptz
Wyszukaj SO dla ograniczeń typu szablonu lub "pojęć". Obiekt do tego został usunięty z C++ 11 w ostatniej chwili. Istnieją jednak mniej automatyczne sposoby osiągnięcia podobnych rezultatów. – luke
@Rapptz, 'char',' int' i 'long', wraz z ich wersjami' unsigned' powinny być obsługiwane. Kod byłby identyczny dla 'int',' long' i 'unsigned long' jeśli' sizeof (int) == sizeof (long) == sizeof (unsigned long) '. – Zeenobit