如何在类型推导中判断一个类是另一个类的子类?

wingfiring 2003-11-18 12:03:55
对于一个template,希望能够为某个类及其子类做特化。
怎么实现这样一个编译期的类型推导?
...全文
191 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
noirchloe 2003-11-18
  • 打赏
  • 举报
回复
说错了,C++设计新思维。。。。。。真丢人,哈哈
上面还可以使用std::type_info
noirchloe 2003-11-18
  • 打赏
  • 举报
回复
是《C++编程新思维》吧?
noirchloe 2003-11-18
  • 打赏
  • 举报
回复
sizeof()
dynamic_cast
合用

先比大小,然后创建指针,看是否能成功转换
wingfiring 2003-11-18
  • 打赏
  • 举报
回复
typedef int MyTYPE;
这是一个侵入型的设计,能不能有一个非侵入型的设计?
hpho 2003-11-18
  • 打赏
  • 举报
回复
<MEC> item 4

template<typename D, typename B>
class IsDerivedFrom1
{
class No{};
class Yes{No no[2];};

static Yes Test(B*);
static No Test(...);

public:
enum{Is=sizeof(Test(static_cast<D*>(0)))==sizeof(Yes)};
};

template<typename D, typename B>
class IsDerivedFrom2
{
static void Constraints(D* p)
{
B* pb = p;
pb = p;
}

protected:
IsDerivedFrom2(){void(*p)(D*)=Constraints;}
};
yjh1982 2003-11-18
  • 打赏
  • 举报
回复
<<C++泛型新思维>>
noirchloe 2003-11-18
  • 打赏
  • 举报
回复
sizeof()
Wolf0403 2003-11-18
  • 打赏
  • 举报
回复
如果要求是:对某个类为根的继承树上的所有类进行同样的一个特化,我有如下解决办法:用一个特定的鉴定参数。
示例代码:

class Base
{
public:
typedef int MyTYPE;
virtual void function() = 0 { cout << "Base" << endl;}
~Base(){cout << "~Base" <<endl;}
};

class D1 : public Base
{
public:
void function() { cout << "D1" << endl;}
virtual ~D1(){cout << "~D1" <<endl;}
};

template <class _Ty, typename _Id_Type = void>
struct S
{
void f()
{
cout << "Normal" << endl;
}
};

template <class _Ty>
struct S <_Ty, typename _Ty::MyTYPE>
{ // 如果对 _Ty::MyTYPE 用不同类型区分,可以对不同的继承树进行分别特化
void f()
{
cout << "Base" << endl;
}
};

int main(void)
{
S<int> s;
s.f();
S<Base, Base::MyTYPE> base;
base.f();
S<D1, D1::MyTYPE> d;
d.f();
}
yjh1982 2003-11-18
  • 打赏
  • 举报
回复
C++设计新思维有嘛
wingfiring 2003-11-18
  • 打赏
  • 举报
回复
dynamic_cast是运行期的类型识别,不是编译期的。
我想实现的是编译期的。

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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