Skip to content

Unifikacja getBin() w binning policies #3

@saganatt

Description

@saganatt

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ć.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions