C++-看看下面这个类的作用?

前端开发 前端开发 主题:1148 回复:2395

C++-看看下面这个类的作用?

归属感 发布于 2017-07-28 字数 258 浏览 1125 回复 3
template< typename D, typename B >

struct ClassA
{
~ClassA()
{
void (*p) (D*, B*) = constraints;
}
private:
static void constraints(D* pd, B* pb)
{
pb = pd;
}
};

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

归属感 2017-10-27 3 楼

__mt 同学的回答基本上是正确的,这段代码就是为了约束 D 是直接或间接公有继承自 B 的,让不符合条件的模板应用在编译期发现。
但是这段代码还有一些问题,当 D 和 B 是相同类型的时候,也是编译不会出错的。所以还需要增加判断 D 和 B 是相同类型的情况,但是具体怎么判断,我也不清楚,希望有同学继续回答。

归属感 2017-09-10 2 楼

这段代码是一个模版类的特化,而且是一个半特化。

template<typename T>

是声明模版的关键字,类型形参是D和B,每一个前面都加上class或者typename,可以包含基本类型,也可以包含类类型。
问题的模版类需要参数类型为指针形式,即constraints()需要用指针形式的参数来做一个赋值操作,所以是一个模版类的特化,它只是对类型做了某些限定,但仍然保留了其一定的模板性,当然,除了T也可以特化为const T*,T&,const T&等。
再举个例子:

 template<class T>
class Class1<T>
{
public:
static bool func(const T
a, const T b)
{
return Class1<T>::func(
a, *b);
}
};

晚风撩人 2017-09-06 1 楼

这段代码的作用是在编译期就可以判断出两个对象是否有继承关系,如果对象A,B,有继承关系,则声明ClassA<A,B> a;声明就不会有错误,因为类型可以转换。但是ClassA<int,char>,编译期间就会报错,因为pb = pd;类型不符

可以发现,最后A B有继承关系时,编译期就可通过