オブジェクトを取得したい(TFile::Get<T>

 1TFile *source = TFile::Open("source.root");
 2
 3TTree *tree = source->Get<TTree>("events");
 4TH1D *h = source->Get<TH1D>("h_energy");
 5
 6if (!tree) {
 7    std::cerr << "Failed to retrieve tree from file!" << std::endl;
 8    source->Close();
 9    return;
10}
11
12if (!h) {
13    std::cerr << "Failed to retrieve histogram from file!" << std::endl;
14    source->Close();
15    return;
16}

TFile::Get<T>は、TFile内のオブジェクトを名前で取得するためのテンプレートメソッドです。 Tには、取得したいオブジェクトの型を指定します。

指定した名前のオブジェクトが存在しない場合や、型が異なる場合はnullptrを返します。 オブジェクトが正常に取得できたかどうかの確認に利用できます。

オブジェクトを取得したい(TFile::Get

1// C++ style
2TTree *tree = dynamic_cast<TTree*>(source->Get("events"));
3
4// C style (not recommended)
5TTree *tree = (TTree*)source->Get("events");

TFile::Getは、ファイル内のオブジェクトを名前で取得するためのメソッドです(テンプレートメソッドではない)。 TObject*型のポインターが返ってくるため、適切な型にキャストする必要があります。

キャストの書き方には C++スタイルのdynamic_castと、 Cスタイルのキャストがあります。 C++スタイルは実行時に型の安全性をチェックするため、誤った型にキャストしようとするとnullptrが返されます。 Cスタイルのキャストは型の安全性をチェックがありません。 誤った型にキャストしてもコンパイルは通りますが、実行時に予期しない動作を引き起こす可能性があります。

注釈

ROOT5まではCスタイルのキャストが広く使われていました。 ウェブ上で見つかるコードやドキュメントではCスタイルのキャストが使われていることがあります。 ROOT6以降ではC++スタイルのキャストもしくは TFile::Get<T>テンプレートメソッドの使用をオオススメします。