У меня есть следующий базовый шаблонный класс.Как принудительно использовать любопытно повторяющийся шаблон шаблона в C++
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
был или наследуется от SomeoneElse
в class B : public Base<SomeoneElse>
.
Я не знаю, является ли это оптимальным способом достижения этого. Выглядит грубо для меня.
Однако я хочу сделать больше. Я хочу, чтобы B
был SomeoneElse
сам. Как я могу это сделать?
'static_cast' ничего не обеспечивает; это просто вызывает неопределенное поведение, если '* this' на самом деле не' T'. –
@ T.C. Он выполняет статические проверки. Тот, о котором вы говорите, должен быть 'reinterpret_cast'. –
Он проверяет только, что 'T' происходит от' Base ', а не' * this' является 'T'. т. е. задано 'class Bar: public Base {}; класс Foo: public Base {}; ', ваш чек ничего не поймает. –