Здравствуйте, Alexander G, Вы писали:
AG>AG>template<class D, class B, D d, B b>
AG>struct override_check : class_initializer<override_check<D, B, d, b> >
AG>{
AG> static void static_ctor()
AG> {
AG> assert(d==static_cast<D>(b));
AG> assert(typeid(d)!=typeid(b));
AG> }
AG> static void static_dtor()
AG> {
AG> }
AG>};
AG>
Забыл сказать, что я у себя определил пустые методы static_ctor()/static_dtor() в классе class_initializer<>, т.ч. если какой-то из них не нужен, что его можно просто не определять.
AG>AG>struct D : S
AG>{
AG> int a(); OVERRIDE_CHECK(&D::a, &S::a);
AG> virtual int b(); OVERRIDE_CHECK(&D::b, &S::b);
AG>};
AG>
При желании можно OVERRIDE_CHECK помещать прямо в тело функции, что бы не загромождать h-ник:
void D::a()
{
OVERRIDE_CHECK(&D::a, &S::a);
...
}
Здравствуйте, remark, Вы писали:
R>Забыл сказать, что я у себя определил пустые методы static_ctor()/static_dtor() в классе class_initializer<>, т.ч. если какой-то из них не нужен, что его можно просто не определять.
Кажется, я неправильно понимаю SFINAE.
template<class D, class B>
struct check : class_initializer<check<D, B> >
{
static void static_ctor()
{
static_cast<D>(B());
}
};
int main()
{
check<void*, double> f; // почему мой static_ctor не выбрасывается и не вызывается унаследованный
}
R>При желании можно OVERRIDE_CHECK помещать прямо в тело функции, что бы не загромождать h-ник:
R>R>void D::a()
R>{
R> OVERRIDE_CHECK(&D::a, &S::a);
R> ...
R>}
R>
Или ещё куда-нибудь.
На самом деле мне хотелось поместить его именно там, т.к. хотелось съиммитировать override в MSVC.
Ещё хотелось довести все проверки до compile-time.
Однако в проверке d==static_cast<D>(b):
1. Равенство функций членов можно проверить только так template<D, D> struct eq; template<D d> struct eq<d, d> {};, т.е. они д.б. шаблонными параметрами одного типа.
2. неявного приведения шаблонных параметров нет, template<class D, class B, D d, B b, D b1 = b> — не катит.
3. static_cast нельзя использовать в CT выражениях (хотя в MSVC можно).
4. константа-статический-член типа указатель-на-член-метод не является CT-константой.
Ну и по второй проверке typeid нелья использовать в CT (хотя в MSVC можно).
Единственная проверка, которая дошла до СТ — проверка сигнатур. static_cast<D>(b) — при разных синатурах d и b так не получится.
Поэтому, используя class_initializer, делаем проверки в RT. Но строго один раз и до main
R>
Здравствуйте, remark, Вы писали:
Я сам долго медитировал на эту тему, однако меня смущало, что в VC решение не работало, в то время как это работало в остальных компиляторах. Implementation defined решения использовать не хотелось. Мне удалось добиться одинакового поведения на всех компиляторах для частного
случаяАвтор: Quasi
Дата: 15.09.08
. А сейчас думаю, почему бы действительно и не совместить несколько подходов (для VC и остальных компиляторов). В общем
R>