Załóżmy, że chcę wymusić ograniczenie, że parametr szablonu przekazany jest potomkiem Foo.Jak wymusić ograniczenie typu dziecko-X w parametrze szablonu?
Czy istnieje sposób na egzekwowanie tego poprzez cechy typu? Niepowodzenie kompilacji static_assert
byłoby świetne.
W poniższym kodzie ustawmy to jako dwuczęściowe (oddzielne) pytanie.
- Pozwala na kompilację tylko
My_Limited_Template<Bar>
. - Umożliwiają tylko kompilację
My_Limited_Template<TBar>
.
EDIT przepraszam za zły nazewnictwa: TBar
i TBaz
mają być zajęcia non-szablon na celach. Właśnie dołączony T przed nazwami disambiguate z klas w części 1.
KOD
struct Foo { }; // no
struct Bar : public Foo { }; // yes
struct Baz { }; // no
template< typename T >
struct TFoo { }; // no
struct TBar : public TFoo<TBar> { }; // yes
struct TBaz { }; // no
template< typename T >
struct My_Limited_Template
{
// Part One:
// My_Limited_Template<Foo> // disallow
// My_Limited_Template<Bar> // allow
// My_Limited_Template<Baz> // disallow
//
// Part Two:
// My_Limited_Template<TFoo<int>> // disallow
// My_Limited_Template<TBar> // allow
// My_Limited_Template<TBaz> // disallow
};
Tak więc druga część będzie * "tylko pozwolić parametry, które pochodzą od TFoo za pomocą CRTP" *? – jrok
@jrok +1, jeśli mógłbyś włączyć CRTP, byłoby jeszcze lepiej, ale nie jestem pewien, czy to możliwe! – kfmfe04
Chodziło mi o to, że ** ty ** używałeś CRTP podczas wyprowadzania TBar. Czy jest to jedyne dziecko 'TFoo', na które chcesz zezwolić, czy może mieć coś takiego jak: struct X: TFoo {};'? –
jrok