Supponiamo che io voglia applicare la limitazione che il parametro template passato è figlio di Foo.Come applicare la limitazione child-of-X al parametro template?
C'è un modo per far rispettare questo attraverso i caratteri? Un errore static_assert
in fase di compilazione sarebbe ottimo.
Nel seguente codice, facciamo una domanda divisa in due parti.
- Consente di compilare solo
My_Limited_Template<Bar>
. - Consentire solo la compilazione di
My_Limited_Template<TBar>
.
EDIT mi scuso per il cattivo di denominazione: TBar
e TBaz
sono destinate ad essere le classi non-template su scopi. Ho appena attaccato T davanti ai nomi per disambiguare dalle classi nella parte 1.
CODICE
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
};
Quindi la seconda parte dovrebbe * "consentire solo i parametri derivati da TFoo utilizzando CRTP" *? – jrok
@jrok +1 se potessi coinvolgere CRTP, sarebbe ancora meglio, ma non sono sicuro che sia possibile! – kfmfe04
Quello che intendevo è che ** tu ** hai usato CRTP quando hai ottenuto TBar. È l'unico tipo di figlio di 'TFoo' che vuoi permettere o è ok avere qualcosa come' struct X: TFoo {}; '? –
jrok