No to skoro schodzimy trochę do offtopu i akurat siedzę na nudnym, zdalnym spotkaniu...
@Adamek Adam:
przykłady mile widziane, wiedza mi wzrośnie
Moim ulubionym użyciem fold expression to przy tworzeniu prostych konceptów. Jak jeszcze dodam trochę cukru w postaci Abbreviated Function Templates and Constrained Auto to mój generyczny kod zaczyna nawet w miarę wyglądać.
template<typename T, typename ...Args>
concept OneOfTypes = (std::is_same_v<T, Args> || ...);
template<typename T>
concept StringOrVector = OneOfTypes<T, std::string, std::vector>;
//------------------------------
size_t size(const StringOrVector auto &val) { return val.size(); }
Oczywiście to tylko prezentacja, użycie powyższego szablonu size
dokładnie w takiej postaci nie ma sensu, ale chyba widać sam zamysł.
Fold expression wraz z innymi ficzerami, jak generyczna lambda, może być również użyte do zbudowania alternatywnej pętli for w compile time:
[&]<std::size...p>(std::index_sequence<p...>)
{
(do_something(p), ...);
}(std::make_index_sequence<SIZE>{});
co w efekcie zostanie rozwinięte do takiej postaci
do_something(p);
do_something(p + 1);
do_something(p + 2);
do_something(p + 3);
//...
do_something(p + SIZE - 1);
czyli de facto mamy odpowiednik
for(size_t p = 0; p < SIZE, ++p)
{
do_something(p);
}
tylko w całości "rozwinięty" w trakcie kompilacji. Warunek taki, że SIZE
musi być znane w trakcie kompilacji.