Для краткости, это упрощенная иерархия:
class IBase
{
public:
virtual ~IBase() = 0 { };
}; // eo IBase
class IDerived : public virtual IBase
{
public:
virtual ~IDerived() = 0 { };
}; // eo IDerived
class Base : public virtual IBase
{
public:
Base() { };
virtual ~Base() { };
}; // eo Base
class Derived : public IDerived
, public Base
{
}; // eo Derived
И функция для определения, реализует ли конкретный указатель на класс переданный «интерфейс»:
template<typename T>
bool same(IBase* base)
{
if(std::is_base_of<T, decltype(*base)>::value)
return true;
return false;
};
И образец:
IDerived* i(new Derived());
bool isSame = same<IDerived>(i);
Я знаю, что я могу неправильно использовать decltype
здесь. Похоже, что я пытаюсь, std::is_base_of<B,D>::value
всегда false
. Я хочу, чтобы эта функция отвечала на вопрос:
Является ли указанный объект производным от типа (T
), переданного в качестве параметра шаблона?