特定の関数呼び出しのグラフを動的に作成したいプロジェクトがあります。たとえば、A と B の 2 つのテンプレート クラスがあり、A には追跡メソッド (グラフ ノードとして保存) があり、B には 3 つのメソッド (非追跡メソッド、追跡メソッド、および A の追跡メソッドを呼び出す追跡メソッド) がある場合、追跡されたメソッド呼び出しのみをノードとしてグラフ オブジェクトに登録できるようにしたいと考えています。グラフ オブジェクトはシングルトンである可能性があります。
template <class TA>
class A
{
public:
void runTracked()
{
// do stuff
}
};
template <class TB>
class B
{
public:
void runNonTracked()
{
// do stuff
}
void runTracked()
{
// do stuff
}
void callATracked()
{
auto a = A<TB>();
a.runTracked();
// do stuff
}
};
void root()
{
auto b1 = B<int>();
auto b2 = B<double>();
b1.runTracked();
b2.runNonTracked();
b2.callATracked();
}
int main()
{
auto b = B<int>();
b.runTracked()
root();
return 0;
}
これにより、以下のようなグラフ オブジェクトが出力されます。
root()
\-- B<int>::runTracked()
\-- B<double>::callATracked()
\-- A<double>::runTracked()
追跡された機能は調整可能である必要があります。ルートが (上記の例のように) 調整可能であれば、それが最適です。これを達成する簡単な方法はありますか?
追跡対象の機能用のマクロと、追跡対象の関数をノードとして登録する Singleton グラフ オブジェクトを導入することを考えていました。ただし、コールスタックで最後に追跡された関数を特定する方法、または (グラフの観点から) 新しいノードを追加するときにどのグラフ ノードを親にするべきかを判断する方法がわかりません。