-
Notifications
You must be signed in to change notification settings - Fork 0
Description
https://github.com/AliceO2Group/AliceO2/blob/dev/Framework/Core/include/Framework/BinningPolicy.h
Różnica jest na poziomie templates.
FlexibleBinningPolicy:
template <typename... T2s>
int getBin(std::tuple<T2s...> const& data) const
ColumnBinningPolicy:
int getBin(std::tuple<typename Ts::type...> const& data) const
NoBinningPolicy:
int getBin(std::tuple<typename C::type> const& data) const
Z perspektywy użytkownika różnica jest taka, że można napisać:
int bin = myColumnBinning.getBin(collision1.posZ(), multiplicity);
Ale przy flexible binning trzeba jawnie napisać std::tuple:
int bin = myFlexibleBinning.getBin(std::tuple(collision1.posZ(), multiplicity));
Bez napisania explicite std::tuple użytkownicy dostają ścianę tekstu z błędu kompilacji:
cannot convert '<brace-enclosed initializer list>' to 'const std::tuple<>&
I kompilator uważa, że T2s = {}, tj. nie rozpoznaje, że typy posZ i multiplicity (float i float) to miały być T2s.
W innych binning policies typy argumentów getBin są dedukowane z typów w template klasy, dlatego kompilator się na nich nie wywala.
Możecie w naprawionych tutorialach napisać taska na to (jakby unit test), i zobaczyć, jak wygląda błąd kompilacji.
Pytanie, czy możemy pozbyć się tego template <typename... T2s>, czyli napisać, jakie mają być typy argumentów getBin() na podstawie Ts... z szablonu klasy. To zadanie może wymagać od was większej akrobacji z templates, gdyż Ts... w FlexibleBinning to pomieszane typy kolumn i typy funkcji lambda.
Zostawię Wam do przemyślenia, możemy się spotkać po weekendzie i to omówić.