Re[2]: [Trick] gcc - проверить перекрытие виртуального метод
От: remark Россия http://www.1024cores.net/
Дата: 15.09.08 05:01
Оценка:
Здравствуйте, 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);
  ...
}




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: [Trick] gcc - проверить перекрытие виртуального метод
От: Alexander G Украина  
Дата: 15.09.08 06:22
Оценка:
Здравствуйте, 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>
Русский военный корабль идёт ко дну!
Re: [Trick] Конструктор класса
От: Quasi  
Дата: 15.09.08 17:28
Оценка:
Здравствуйте, remark, Вы писали:

Я сам долго медитировал на эту тему, однако меня смущало, что в VC решение не работало, в то время как это работало в остальных компиляторах. Implementation defined решения использовать не хотелось. Мне удалось добиться одинакового поведения на всех компиляторах для частного случая
Автор: Quasi
Дата: 15.09.08
. А сейчас думаю, почему бы действительно и не совместить несколько подходов (для VC и остальных компиляторов). В общем


R>

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.