Mam następującą klasę podstawowego szablonu.Jak wymusić użycie ciekawie powtarzającego się wzorca szablonu w C++
template<typename T>
class Base {
public:
void do_something() {
}
};
jest przeznaczony do stosowania jako co ciekawe powtarzające się szablon wzoru. Powinien być dziedziczony jak class B : public Base<B>
. Musi być , a nie odziedziczony jak class B : public Base<SomeoneElse>
. Chcę statycznie egzekwować ten wymóg. Jeśli ktoś użyje tego błędu, oczekuję błędu w fazie kompilacji.
Co robię, umieszczam static_cast<T const&>(*this)
w do_something()
. W ten sposób klasa dziedzicząca szablon jest dziedziczona z klasy podanej jako parametr szablonu. Przepraszamy za mylące wyrażenie. W prostym angielskim wymaga B
lub dziedziczy po SomeoneElse
w class B : public Base<SomeoneElse>
.
Nie wiem, czy jest to optymalny sposób, aby to osiągnąć. Wygląda obrzydliwie dla mnie.
Jednak chcę zrobić więcej. Chcę się upewnić, że B
jest sam. Jak mogę to zrobić?
'static_cast' nie wymusza niczego; powoduje jedynie niezdefiniowane zachowanie, jeśli '* this' nie jest w rzeczywistości' T'. –
@ T.C. Wykonuje kontrole statyczne. Ten, o którym mówisz, powinien być "reinterpret_cast". –
Sprawdza tylko, czy 'T' pochodzi od' Base ', a nie' * this' to 'T'. tj., biorąc pod uwagę 'class Bar: public Base {}; klasa Foo: publiczna baza {}; ', twój czek niczego nie złapie. –