У меня есть следующий базовый класс шаблона.
template<typename T>
class Base {
public:
void do_something() {
}
};
Он предназначен для использования в качестве любопытно повторяющегося шаблона шаблона. Он должен быть унаследован как class B : public Base<B>
. Он не должен наследоваться, как class B : public Base<SomeoneElse>
. Я хочу статически закрепить это требование. Если кто-то использует это неправильно, я ожидаю ошибки на этапе компиляции.
Я просто вставляю static_cast<T const&>(*this)
в do_something()
. Таким образом, класс, наследующий шаблон, является или наследуется от класса, указанного в качестве параметра шаблона. Извините за запутанное выражение. Говоря простым языком, он требует B
is или наследуется от SomeoneElse
в class B : public Base<SomeoneElse>
.
Я не знаю, является ли это оптимальным способом добиться этого. Мне это кажется отвратительным.
Однако я хочу сделать больше. Я хочу убедиться, что B
сам SomeoneElse
. Как я могу это сделать?
static_cast
ничего не навязывает; он просто вызывает неопределенное поведение, если*this
на самом деле не являетсяT
. - person T.C.   schedule 14.05.2015reinterpret_cast
. - person Hot.PxL   schedule 14.05.2015T
является производным отBase<T>
, а не*this
являетсяT
. т.е., учитываяclass Bar : public Base<Bar> {}; class Foo : public Base<Bar> {};
, ваш чек ничего не поймает. - person T.C.   schedule 14.05.2015