In C++20 we can do this:
#include <ranges>
#include <vector>
template <std::ranges::range Range>
requires std::same_as<std::ranges::range_value_t<Range>, int>
auto TransformIt(Range r)
{
return r | std::views::transform([](int n) { return n * n; });
}
int main()
{
std::vector<int> v;
auto r = TransformIt(v);
return 0;
}
or improve our code with this:
template <class R, class Value>
concept range_over = std::ranges::range<R> &&
std::same_as<std::ranges::range_value_t<R>, Value>;
template <range_over<int> Range>
auto TransformIt(Range r)
{
return r | std::views::transform([](int n) { return n * n; });
}
Or you still work for some company in Russia where the prohibition of use dynamic_cast
is the most important architectural solution?