Я создаю простой оператор конвейера для векторов, который пользователь будет использовать следующим образом (псевдокод):
auto x = std::vector{1,2,3} | push_back(10)
| push_back(100)
;
Теперь я попытался определить оператор трубопровода следующим образом:
template <typename T>
constexpr inline auto& operator| (std::vector<T>&& vec, std::invocable<std::vector<T>> auto&& func);
Но теперь vec только для r-значений (поскольку тип самого vec не выводится)! Но я хочу, чтобы он также привязывался к l-значениям. Как мне это сделать?
Одно уродливое, но функциональное решение состояло бы в том, чтобы сделать еще одну перегрузку для моего оператора конвейера, но с std::vector<int>&
. Однако это не масштабируется (2 ^ n перегрузок для n аргументов!), и я считаю, что это та самая причина, по которой были созданы универсальные ссылки.
Как я могу использовать универсальные ссылки в этом случае?
invocable<T>
, а неinvocable<vector<T>>
? Предположительно,push_back(100)
- это вызываемый объект, который принимаетvector<int>
, а не вызываемый объект, который принимаетint
? - person Barry   schedule 10.04.2021