2

文字列を TTree に保存した後

std::string fProjNameIn,  fProjNameOut;
TTree *tTShowerHeader;
tTShowerHeader = new TTree("tTShowerHeader","Parameters of the Shower");
tTShowerHeader->Branch("fProjName",&fProjNameIn);
tTShowerHeader->Fill();

私は次のことをしようとしています

fProjNameOut = (std::string) tTShowerHeader->GetBranch("fProjName");

ただし、コンパイルされません

std::cout << tTShowerHeader->GetBranch("fProjName")->GetClassName() << std::endl;

教えてください、このブランチは次のタイプですstring

ルートツリーから std::string を読み取る標準的な方法はありますか?

4

3 に答える 3

2

tTShowerHeader->GetBranch("fProjName")->を呼び出しており、コンパイルされます。つまり、 の戻り値の型tTShowerHeader->GetBranch()ポインタです。

GetClassName()さらに、そのポインターを呼び出してコンパイルするため、クラス型へのポインターです。

さらに、 にはメソッドがないためではstd::stringありませ。なるほど、そうらしいテキストを提供する適切なメソッドを見つける必要があります。GetClassName()std::string*TBranch *

PS: C++ で C スタイルのキャストを使用することを忘れてください。C スタイルのキャストは、タイプがたまたま何であるかに応じて異なることを行うため、悪です。代わりに、制限されたstatic_castdynamic_castconst_castまたは関数スタイルのキャストを使用してください (reinterpret_cast本当に必要な場合は、非常にまれなはずです)。

于 2011-08-10T14:11:25.603 に答える
1

わかりました、これにはしばらく時間がかかりましたが、ツリーから情報を取得する方法を見つけました。情報を直接返すことはできません。情報が指定された変数を介してのみ返すことができます。

std::string fProjNameIn,  fProjNameOut;
TTree *tTShowerHeader;

fProjnameIn = "Jones";
tTShowerHeader = new TTree("tTShowerHeader","Parameters of the Shower");
tTShowerHeader->Branch("fProjName",&fProjNameIn);
tTShowerHeader->Fill();//at this point the name "Jones" is stored in the Tree

fProjNameIn = 0;//VERY IMPORTANT TO DO (or so I read)
tTShowerHeader->GetBranch("fProjName")->GetEntries();//will return the # of entries
tTShowerHeader->GetBranch("fProjName")->GetEntry(0);//return the first entry
//At this point fProjNameIn is once again equal to "Jones"

ルートでは、TTree クラスは入力に使用される変数へのアドレスを格納します。GetEntry() を使用すると、同じ変数に TTree に格納されている情報が入力されます。tTShowerHeader->Print() を使用して、各ブランチの完全数を表示することもできます。

于 2011-08-10T15:36:58.937 に答える