dynamic_cast 能否动态决定转换类型

hoya5121 2010-02-04 04:37:19
标题可能不太明白。
我再详细说一下
dynamic_cast<T*>(p)
这个表达式里,T总是已知的。但是我想做一个函数,判断某个指针能否转换为某类指针
bool convert(T, p);
就是T作为参数的。
我知道模板可能可以。但是我可能是多重继承,这样我需要这个函数可以支持我判断所有的基类
bool convert(T, T, T, p); //这里我判断p是否是从3个类多重继承的
这样的话好像就不能用模板了? 就是模板参数是否能像不定参数那样支持不定数量的参数呢
或者我这样的需求有什么好办法
...全文
371 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
howlet2 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 howlet2 的回复:]
自己去写vector又不一定只用来给自己用。就像学stl一样,会用stl只是学习的一部分。stl的灵魂是它的泛型思想。学会了这种设计思想,不必只会用stl来得没有价值
[/Quote]
今天用脑过度了, 说话都组织不好了
howlet2 2010-02-04
  • 打赏
  • 举报
回复
自己去写vector又不一定只用来给自己用。就像学stl一样,会用stl只是学习的一部分。stl的灵魂是它的泛型思想。学会了这种设计思想,不必只会用stl来得没有价值
howlet2 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 howlet2 的回复:]
引用 34 楼 yzx714 的回复:
引用 33 楼 howlet2 的回复:
参考 深入浅出mfc 六大关键技术仿真之运行时识别机制

MFC的烂实现,现在标准都有了,还用那个干什么

不是用它的那个平台,是借鉴它的设计框架。
[/Quote]
没看清你的意思,不好意思~_~
lovesi3344 2010-02-04
  • 打赏
  • 举报
回复

小桥用娴熟的英文代码说明实力
老邓用抽象的中文表述展现实力
yzx714 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 howlet2 的回复:]
引用 34 楼 yzx714 的回复:
引用 33 楼 howlet2 的回复:
参考 深入浅出mfc 六大关键技术仿真之运行时识别机制

MFC的烂实现,现在标准都有了,还用那个干什么

不是用它的那个平台,是借鉴它的设计框架。
[/Quote]既然标准都给你实现了你还实现做什么?难道你的vector是自己实现的?你不用库函数?
无意义劳动是第一罪恶!
howlet2 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 yzx714 的回复:]
引用 33 楼 howlet2 的回复:
参考 深入浅出mfc 六大关键技术仿真之运行时识别机制

MFC的烂实现,现在标准都有了,还用那个干什么
[/Quote]
不是用它的那个平台,是借鉴它的设计框架。
howlet2 2010-02-04
  • 打赏
  • 举报
回复
你可能要写这样的一个基类,就可以为每个子类都加上一个IsKindOf的功能。
class CObject
{
public:
CObject(){}
virtual ~CObject(){}

public:

DECLARE_DYNAMIC(CObject)
virtual bool IsKindOf(CRuntime* pType);
};
具体实现慢慢研究 哈哈
卡卡Gemini 2010-02-04
  • 打赏
  • 举报
回复
当初学的时候还写过这个代码,好像是利用静态变量的内存唯一性搞出来的[Quote=引用 33 楼 howlet2 的回复:]
参考 深入浅出mfc 六大关键技术仿真之运行时识别机制

[/Quote]
yzx714 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 howlet2 的回复:]
参考 深入浅出mfc 六大关键技术仿真之运行时识别机制

[/Quote]MFC的烂实现,现在标准都有了,还用那个干什么
howlet2 2010-02-04
  • 打赏
  • 举报
回复
参考 深入浅出mfc 六大关键技术仿真之运行时识别机制
yzx714 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 mstlq 的回复:]
引用 28 楼 yzx714 的回复:
引用 26 楼 mstlq 的回复:
引用 24 楼 hoya5121 的回复:
引用 21 楼 mstlq 的回复:
其实就写一个
bool convert(T, p);
然后外部写一个循环来调用,我认为是比较经济的解决方案……


是呀,那我现在想探讨的就是这个bool convert(T, p); 如何实现?

bool convert(const char* className, void* p)

举例, convert("CA", p)


模板函数……
C/C++ code#include <iostream>usingnamespace std;//三基类class A{public:virtual~A(){};};class B:public A{};class C:public B{};//测试类class D :public C {};

template <class D>bool convert(A*pb)
{
    D*pd=dynamic_cast <D*>(pb);return (pd!=NULL);
}int main(int argc,char**argv)
{
    A*pd=new D();if(convert <B>(pd))//mark        cout < <"pd所指对象可以转化成B类对象" < <endl;else
        cout < <"pd所指对象不可以转化成B类对象" < <endl;if(convert <C>(pd))
        cout < <"pd所指对象可以转化成C类对象" < <endl;else
        cout < <"pd所指对象不可以转化成C类对象" < <endl;

    delete pd;return0;
}
楼主要求从字符串指定类型,我绝得可以通过RTTI实现,你们怎么想?

实现是可以实现,不过与其搞得那么麻烦,还不如直接换一个编程语言……
[/Quote]对,这个我用python可以在10行之内搞定!
mstlq 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 yzx714 的回复:]
引用 26 楼 mstlq 的回复:
引用 24 楼 hoya5121 的回复:
引用 21 楼 mstlq 的回复:
其实就写一个
bool convert(T, p);
然后外部写一个循环来调用,我认为是比较经济的解决方案……


是呀,那我现在想探讨的就是这个bool convert(T, p); 如何实现?

bool convert(const char* className, void* p)

举例, convert("CA", p)


模板函数……
C/C++ code#include <iostream>usingnamespace std;//三基类class A{public:virtual~A(){};};class B:public A{};class C:public B{};//测试类class D :public C {};

template <class D>bool convert(A*pb)
{
    D*pd=dynamic_cast <D*>(pb);return (pd!=NULL);
}int main(int argc,char**argv)
{
    A*pd=new D();if(convert <B>(pd))//mark        cout < <"pd所指对象可以转化成B类对象" < <endl;else
        cout < <"pd所指对象不可以转化成B类对象" < <endl;if(convert <C>(pd))
        cout < <"pd所指对象可以转化成C类对象" < <endl;else
        cout < <"pd所指对象不可以转化成C类对象" < <endl;

    delete pd;return0;
}
楼主要求从字符串指定类型,我绝得可以通过RTTI实现,你们怎么想?
[/Quote]
实现是可以实现,不过与其搞得那么麻烦,还不如直接换一个编程语言……
traceless 2010-02-04
  • 打赏
  • 举报
回复
哎 。。。

有时就需要出去走走,才明白的。。。
mstlq 2010-02-04
  • 打赏
  • 举报
回复
要说的,其实1楼已经全部说完了……

可惜楼主不听……
yzx714 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 mstlq 的回复:]
引用 24 楼 hoya5121 的回复:
引用 21 楼 mstlq 的回复:
其实就写一个
bool convert(T, p);
然后外部写一个循环来调用,我认为是比较经济的解决方案……


是呀,那我现在想探讨的就是这个bool convert(T, p); 如何实现?

bool convert(const char* className, void* p)

举例, convert("CA", p)


模板函数……
C/C++ code#include<iostream>usingnamespace std;//三基类class A{public:virtual~A(){};};class B:public A{};class C:public B{};//测试类class D :public C {};

template<class D>bool convert(A*pb)
{
D*pd=dynamic_cast<D*>(pb);return (pd!=NULL);
}int main(int argc,char**argv)
{
A*pd=new D();if(convert<B>(pd))//mark cout<<"pd所指对象可以转化成B类对象"<<endl;else
cout<<"pd所指对象不可以转化成B类对象"<<endl;if(convert<C>(pd))
cout<<"pd所指对象可以转化成C类对象"<<endl;else
cout<<"pd所指对象不可以转化成C类对象"<<endl;

delete pd;return0;
}
[/Quote]楼主要求从字符串指定类型,我绝得可以通过RTTI实现,你们怎么想?
yzx714 2010-02-04
  • 打赏
  • 举报
回复
C++又不是没有RTTI,楼主自行Google一下就应该可以实现你的要求了
mstlq 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 hoya5121 的回复:]
引用 21 楼 mstlq 的回复:
其实就写一个
bool convert(T, p);
然后外部写一个循环来调用,我认为是比较经济的解决方案……


是呀,那我现在想探讨的就是这个bool convert(T, p); 如何实现?

bool convert(const char* className, void* p)

举例, convert("CA", p)
[/Quote]

模板函数……
#include <iostream>
using namespace std;

//三基类
class A{public: virtual ~A(){};};
class B:public A{};
class C:public B{};


//测试类
class D :public C {};

template<class D>
bool convert(A *pb)
{
D *pd=dynamic_cast<D *>(pb);
return (pd!=NULL);
}

int main(int argc, char **argv)
{
A *pd= new D();

if(convert<B>(pd))//mark
cout<<"pd所指对象可以转化成B类对象"<<endl;
else
cout<<"pd所指对象不可以转化成B类对象"<<endl;

if(convert<C>(pd))
cout<<"pd所指对象可以转化成C类对象"<<endl;
else
cout<<"pd所指对象不可以转化成C类对象"<<endl;

delete pd;

return 0;
}
SammyLan 2010-02-04
  • 打赏
  • 举报
回复
参考...MFC RTCI
自己实现这套机制不就得了
hoya5121 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 mstlq 的回复:]
其实就写一个
bool convert(T, p);
然后外部写一个循环来调用,我认为是比较经济的解决方案……
[/Quote]

是呀,那我现在想探讨的就是这个bool convert(T, p); 如何实现?

bool convert(const char* className, void* p)

举例, convert("CA", p)
必成桂 2010-02-04
  • 打赏
  • 举报
回复
这种设计有必要么。

加载更多回复(22)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧