gpt4 book ai didi

c++ - 这个类的行为与其父类相同吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:54 27 4
gpt4 key购买 nike

我这样定义一个模板类:

template <typename A, typename B>
class SomeThing
{
~~~
};

我想使用 SomeThing<X, Y> .那不是很整洁,所以我这样做了:

typedef SomeThing<X, Y> SomeNewThing;

但是,我还有一些问题。 SomeNewThing 的转发声明将是这种形式。

class X;
class Y;
template <typename A, typename B> class SomeThing;
typedef SomeThing<X, Y> SomeAppropriateNewName;

在每个包含这个类的头文件中都写这个很不方便。因此,我没有使用 typedef,而是尝试使用继承。

class SomeAppropriateNewName : public Something<X, Y> {};

除了继承,它只是一个空类。前向声明将是这样的。

class SomeAppropriateNewName;

看起来一切都应该正常工作。

是否 SomeNewThing以与 SomeThing<X, Y> 完全相同的方式行事做什么?

这个类的行为是否与其父类相同?有什么区别吗?

最佳答案

SomeAppropriateNewName有一些差异。其中一些您可以修复。

SomeAppropriateNewName应该将构造函数和其他特殊成员函数转发给它的父级。

如果删除 SomeAppropriateNewName *作为Something<X, Y> *你在没有 virtual 的情况下调用未定义的行为析构函数。实际上,如果SomeAppropriateNewName是空的一切可能都很好。

SomeAppropriateNewName不会像 Something<X, Y> 这样的模式匹配模板重载做。它是一种独特的类型。它将与函数参数匹配一起工作得很好(有细微差别),但是如果你将它传递给:

template<class T> struct is_something:std::false_type{};
template<class X, class Y> struct is_something<Something<X,Y>>:std::true_type{};

然后 Something<X, Y>给出 true,而 SomeAppropriateNewName给出错误。

往返于 void*必须使用完全相同的类型,除非我认为这两种类型都是标准布局。

关于c++ - 这个类的行为与其父类相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26450851/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com