#include <windows.h>
#include <iostream>
using namespace std;
class Object
{
public:
Object(){}
~Object(){}
};
class Test : public Object
{
public:
Test(){}
~Test(){}
};
template <class T> class myClass
{
public:
myClass()
{
if(Object * obj = dynamic_cast<Object*>(m_data)) // error C2681: 'int *' : invalid expression type for dynamic_cast
{
cout << "is instanse of Object " << endl;
}
}
~myClass(){}
T * m_data;
};
int _tmain(int argc, _TCHAR* argv[])
{
myClass<int> m;
myClass<Test *> m1;
return 0;
}
dynamic_cast
Суть проблемы, есть некий шаблонный класс. Если в качестве шаблона задействованы производные лкасса Object, необходимо выполнить над ними какое-то действие. Если T - простой тип или класс не являющийся потомком Object, никаких действий выполнять не надо. У меня ошибка на dynamic_cast...
Может быть можно как-то по-другому это реализовать?
Код:
Цитата: ШпиЁн
доброго всем дня :)
Суть проблемы, есть некий шаблонный класс. Если в качестве шаблона задействованы производные лкасса Object, необходимо выполнить над ними какое-то действие. Если T - простой тип или класс не являющийся потомком Object, никаких действий выполнять не надо. У меня ошибка на dynamic_cast...
Может быть можно как-то по-другому это реализовать?
Суть проблемы, есть некий шаблонный класс. Если в качестве шаблона задействованы производные лкасса Object, необходимо выполнить над ними какое-то действие. Если T - простой тип или класс не являющийся потомком Object, никаких действий выполнять не надо. У меня ошибка на dynamic_cast...
Может быть можно как-то по-другому это реализовать?
Настоящие программисты C++ никогда не используют dynamic_cast, и уж тем более при работе с шаблонами, и особенно в таких простых случаях, как твой. Они вообще никогда не применяют dynamic_cast. :)
Решение твоей проблемы лежит в паре строк:
Код:
template <class T>
class myClass
{
public:
myClass() {
onConstruct(m_data);
}
~myClass() {}
private:
void onConstruct(Object*) {
cout << "is instanse of Object " << endl;
}
void onConstruct(...) {}
T* m_data;
};
class myClass
{
public:
myClass() {
onConstruct(m_data);
}
~myClass() {}
private:
void onConstruct(Object*) {
cout << "is instanse of Object " << endl;
}
void onConstruct(...) {}
T* m_data;
};
но это не совсем то что нужно.
Код:
int _tmain(int argc, _TCHAR* argv[])
{
myClass<int> m;
myClass<Test *> m1;
return 0;
}
{
myClass<int> m;
myClass<Test *> m1;
return 0;
}
у меня в любом случае, при создании m и m1 вызывается onConstruct(...)
. дело в том что нужно как-то отличать объекты класса Object( производных от него) от всех других типов шаблона. :)
onConstruct(Object*) не вызывается вообще в этом варианте.
Цитата: ШпиЁн
спасибо :)
но это не совсем то что нужно.
у меня в любом случае, при создании m и m1 вызывается onConstruct(...)
. дело в том что нужно как-то отличать объекты класса Object( производных от него) от всех других типов шаблона. :)
onConstruct(Object*) не вызывается вообще в этом варианте.
но это не совсем то что нужно.
Код:
int _tmain(int argc, _TCHAR* argv[])
{
myClass<int> m;
myClass<Test *> m1;
return 0;
}
{
myClass<int> m;
myClass<Test *> m1;
return 0;
}
у меня в любом случае, при создании m и m1 вызывается onConstruct(...)
. дело в том что нужно как-то отличать объекты класса Object( производных от него) от всех других типов шаблона. :)
onConstruct(Object*) не вызывается вообще в этом варианте.
(с) "... Просто, вы их не умеете готовить!"
Вот эта запись: T* m_data;
с учетом вот этой: myClass<Test *> m1;
обозначает, что твое поле m1 будет типа Test**, а не как ты видимо хотел Test*.
Конечно, Test** не может быть приведен к Object* !!!
Поэтому и onConstruct(Object*) не вызывается.
спасибо, все заработало :)