Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何确保CRTP不提供错误的超类?_C++_C++11_Crtp_Static Assert - Fatal编程技术网

C++ 如何确保CRTP不提供错误的超类?

C++ 如何确保CRTP不提供错误的超类?,c++,c++11,crtp,static-assert,C++,C++11,Crtp,Static Assert,在这本书中,我们写道 template <class Derived> class Base { }; class Derived : public Base<Derived> { }; 模板 阶级基础{ }; 派生类:公共基{ }; 有什么好方法可以使代码健壮?另一个复制粘贴遗漏,从而使以下代码段引发编译时错误: class AnotherDerived : public Base<Derived> { }; 另一个派生类:公共基{ }; 我使用V

在这本书中,我们写道

template <class Derived>
class Base {
};

class Derived : public Base<Derived> {
};
模板
阶级基础{
};
派生类:公共基{
};
有什么好方法可以使代码健壮?另一个复制粘贴遗漏,从而使以下代码段引发编译时错误:

class AnotherDerived : public Base<Derived> {
};
另一个派生类:公共基{
};

我使用Visual C++ 2013。

< p> >代码> StistalyAsStult<代码>,该参数从<代码> Base<代码>中得到,但这是你能做到的。

< P>使<代码> BASE>代码>析构函数私有,然后使<代码>派生<代码> <代码> BASE < /C> >:< /P>
模板
阶级基础{
private:~Base()=默认值;
朋友衍生;
};
派生类:公共基{
};
这实际上并不意味着要做什么

class AnotherDerived : public Base<Derived> {
};
另一个派生类:公共基{
};

非法,但任何试图实际构造另一个派生的
的尝试都会失败。

Base
一个私有dtor,然后让
派生的
成为朋友?可能是构造函数Base(派生的&){}-但这几乎是妄想症。@DieterLücking:考虑过,但这会弄乱接口,太…@T.C.:好主意——但这是否可能,而不允许
派生的
访问
基的其他私有成员?@krlmlr:您可以添加另一个继承层来保存需要保持私有的成员。使用合成也应该是可能的。(记住友谊不是传递性的)你会在哪里做到?在作为成员声明的基类内部,该信息可能不可用(目前)--事实上,该标准要求第二个参数
is_base\u的
是一个完整类型。在成员函数内部,可能需要该成员函数的实例化来实际执行检查。@dyp:如果在
Base
的构造函数中执行检查,是否总是要执行检查?我不太熟悉静态断言--请您举个例子好吗?@krlmlr据我所知,只有实例化了
Base
的构造函数(例如,如果调用了该构造函数),才会检查该构造函数中的
static\u assert
。虽然错误消息可能更好,但我认为要执行的
static\u assert
检查的要求比建议的检查T.C.更高。谢谢,这对我来说很有用——我现在有了一个类
BaseImp
,从中继承
Base
,以避免将私有成员暴露给伪朋友。
class AnotherDerived : public Base<Derived> {
};