Мне интересно, можно ли преобразовать простой цикл, который вызывается через пакет параметров в constexpr
с более простым кодом. Этот пример кода показывает, что я пытаюсь сделатьПреобразование вариационного шаблона в constexpr
struct Student {
AgeCategory age;
Income income;
bool is_student;
CreditRating credit_rating;
bool buys_computer;
};
auto find_probability(const double x, const double mean, const double stdev) -> double;
typedef std::tuple<double, double> MeanStdDev;
typedef std::vector<MeanStdDev> MeanStdDevVec;
// This code seems verbose to me. Is there a simpler way to express this
// loop which iterates over a vector and parameter pack, possibly
// using constexpr. C++14/17 idioms are fine.
template<typename Attr>
auto get_probability(const MeanStdDevVec& v, const size_t n, const Student& s, Attr attr) -> double {
double mean, stdev;
std::tie(mean, stdev) = v[n];
return find_probability(static_cast<double>(std::invoke(attr, s)), mean, stdev);
}
template<typename First, typename... Attr>
auto get_probability(const MeanStdDevVec& v, const size_t n, const Student& s, First f, Attr... attr) -> double {
double mean, stdev;
std::tie(mean, stdev) = v[n];
return find_probability(static_cast<double>(std::invoke(f,s)), mean, stdev) * get_probability(v, n + 1, s, attr...);
}
template<typename ...Attr>
auto calculate_class_probability(const std::map<bool, MeanStdDevVec>& summaries, const Student& s, Attr... attributes) {
for (const auto& i : summaries) {
get_probability(i.second, 0L, s, attributes...);
}
}
вызывается из
Student s;
calculate_class_probability(class_summaries, s , &Student::age, &Student::income, &Student::credit_rating, &Student::is_student);
Это довольно умно, поэтому спасибо – Ronnie
@Ronnie Спасибо! Если вам кажется, что он отвечает на ваш вопрос, отметьте его принятым (нажмите галочку). Приветствия. –