Angenommen, ich möchte die Einschränkung erzwingen, dass der übergebene Template-Parameter ein Kind von Foo ist.Wie erzwingen Kind-of-X-Beschränkung für Vorlagenparameter?
Gibt es eine Möglichkeit, dies durch Typ-Züge zu erzwingen? Ein Kompilierungsfehler static_assert
wäre großartig.
In dem Code unten, machen wir es eine zweiteilige (separate) Frage.
- Lassen Sie nur
My_Limited_Template<Bar>
kompilieren. - Lassen Sie nur
My_Limited_Template<TBar>
kompilieren.
EDIT ich für die schlechte Namensgebung entschuldigen: TBar
und TBaz
sollen Nicht-Template-Klassen auf Zwecke sein. Ich lege T nur vor dem Namen aus den Klassen in Teil eindeutig zu machen 1.
CODE
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
};
So ist der zweite Teil würde * werden „nur Parameter ermöglichen, die von TFoo abgeleitet werden unter Verwendung CRTP“ *? – jrok
@jrok +1 wenn du CRTP mit einbeziehen könntest, wäre das noch besser, aber ich bin mir nicht sicher, ob das möglich ist! – kfmfe04
Was ich meinte ist, dass ** Sie ** CRTP verwendet haben, wenn Sie TBar ableiten. Ist das die einzige Art von 'TFoo'-Kind, das du erlauben willst oder ist es in Ordnung, etwas wie 'struct X: TFoo {};'? –
jrok