Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С++ Макросы

59K
09 февраля 2012 года
SANRIZE
16 / / 06.04.2011
Есть у меня идейка интересная да вот только я не знаю как это реализовать. Есть некие классы которые наследуются от разных классов. Нужно на этапе компиляции проекта определить наследуется ли класс от определенного класса. Как такую проверку сделать?
11
10 февраля 2012 года
oxotnik333
2.9K / / 03.08.2007
static_cast не?
24K
10 февраля 2012 года
cn_venom
11 / / 23.01.2007
Цитата: SANRIZE
Как такую проверку сделать?


Задача экзотическая, но решение есть: boost::enable_if + boost::is_base_and_derived. Обсуждение.
Как именно должна проверка происходить, может быть достаточно частичной специализации шаблона?

59K
10 февраля 2012 года
SANRIZE
16 / / 06.04.2011
static_cast однозначно не подходит
а насчет библеотеки boost будем смотреть
Код:
class Base //и подобные этому
{...};
class Test : public Base
{
  Test()
  {
      if(Некая проверка == Base)
      {кусок кода}
      else
      {кусок кода}
  }
};


class Test1 : public Base1
{
  Test1()
  {
      if(Некая проверка == Base)
      {кусок кода}
      else
      {кусок кода}
  }
};
24K
10 февраля 2012 года
cn_venom
11 / / 23.01.2007
Так может подойдет проверка в рантайме?:

Код:
#include <iostream>
#include <typeinfo.h>

class A
{
    virtual void method() {};
};

class B : public A
{
    virtual void method() {};
};

class C
{
    virtual void method() {};
};

class D : public C, public A
{
    virtual void method() {};
};

template <class TB, class TD>
char* IsDerived(TD& d, TB& b)
{
    try
    {
        TB& base = dynamic_cast<TB&>(d);
    }
    catch(std::bad_cast& e)
    {
        return "no";
    }
    return "yes";
}


void main()
{
    A a;
    B b;
    C c;
    D d;

    std::cout << "A derives B " << IsDerived(a, b) << std::endl;
    std::cout << "B derives A " << IsDerived(b, a) << std::endl;

    std::cout << "C derives A " << IsDerived(c, a) << std::endl;
    std::cout << "D derives C " << IsDerived(d, c) << std::endl;

    std::cout << "D derives B " << IsDerived(d, b) << std::endl;
    std::cout << "D derives A " << IsDerived(d, a) << std::endl;
}
59K
11 февраля 2012 года
SANRIZE
16 / / 06.04.2011
Получилось и без того что я там надумал только шума наделал)! Тема закрыта всем большое спасибо кто участвовал!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог