派生クラスの型をとるテンプレート基本クラスがある場合、この基本クラスのthisポインタを派生クラスの型にキャストするのは安全ですか?基本クラスのthisポインタを派生型にキャストした場合、安全であり、守れませんか?
基本クラスA
がこのポインタをテンプレートパラメータ(Derived
)にキャストするこのコードを検討してください。また、提供された型が実際にこのクラスから派生しているかどうかをチェックします。それは明らかに(ここで)動作しますが、明確に定義されていますか?
#include <iostream>
class D;
template<typename Derived, typename T>
class A
{
public:
Derived *thisToDerived() {
static_assert(std::is_base_of< A<Derived, T>, Derived>::value, "not");
return static_cast<Derived*>(this);
}
private:
T m;
};
class D : public A<D, int>
{
private:
double d;
float f;
};
int main() {
D d;
std::cout<<"this: "<<&d<<"\nderived: "<<d.thisToDerived();
}
関連:https://stackoverflow.com/q/2469013/1896169 – Justin
また、関連しますほとんどこれに答える:https://stackoverflow.com/q/4173254/1896169 – Justin
これを簡単に言えば、これは安全です – Justin