これは私が誰かが別のクラスのデストラクタでMyClass
を作成(またはどこかの呼び出しスタック内のアクティブなデストラクタで)されたかどうかを検出したいWhy can't Alexandrescu use std::uncaught_exception() to implement SCOPE_FAIL in ScopeGuard11?別のデストラクタの実行中にオブジェクトが作成されたかどうかを検出するトリックはありますか?
のフォローアップの一種です。
class MyClass
{
public:
MyClass(){
assert(???what to put here????);
}
}
void f(){
MyClass m; //whether this asserts should be context dependant
}
class OtherClass{
~OtherClass(){
MyClass m; //this should assert
f(); //this should too;
}
}
int main()
{
MyClass m; //this should not assert
f(); //this should also not assert
}
一つの試みは、次のようになります。
assert(!std::uncaught_exception());
が、デストラクタは、オブジェクトがスコープ外に行ってきましたので、それが呼び出されていない場合は、例外のため、呼び出されている場合にのみ動作します。
デストラクタを明示的に設計して実行をシグナルすることができない限り、これは可能です。一般的に、あなたの関数がどこから呼び出されたのかを知ることはできません。 –
あなたはどのようにポータブルソリューションをしたいですか? – Flexo
あなたのソリューションを特定のコンパイラバージョンに特化させ、 'OtherClass'のデストラクタを見つけるために' MyClass'のコンストラクタでスタックを調べることができます。私は個人的には、それが何かのためにはあまりにも多くの仕事だと思っています...そして、エラーの原因になります。 – Synxis