class Base //и подобные этому
{...};
class Test : public Base
{
Test()
{
if(Некая проверка == Base)
{кусок кода}
else
{кусок кода}
}
};
class Test1 : public Base1
{
Test1()
{
if(Некая проверка == Base)
{кусок кода}
else
{кусок кода}
}
};
С++ Макросы
Есть у меня идейка интересная да вот только я не знаю как это реализовать. Есть некие классы которые наследуются от разных классов. Нужно на этапе компиляции проекта определить наследуется ли класс от определенного класса. Как такую проверку сделать?
static_cast не?
Цитата: SANRIZE
Как такую проверку сделать?
Задача экзотическая, но решение есть: boost::enable_if + boost::is_base_and_derived. Обсуждение.
Как именно должна проверка происходить, может быть достаточно частичной специализации шаблона?
static_cast однозначно не подходит
Код:
#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;
}
#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;
}
Получилось и без того что я там надумал только шума наделал)! Тема закрыта всем большое спасибо кто участвовал!