Skip to content

Commit c3b7a35

Browse files
committed
Implement ranges with different boundary types
Implements #8.
1 parent e6492b8 commit c3b7a35

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

range.hpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,10 @@ struct infinite_range_proxy {
181181
iterator begin_;
182182
};
183183

184-
template <typename T>
185-
range_proxy<T> range(T begin, T end) {
186-
return {begin, end};
184+
template <typename T, typename U>
185+
auto range(T begin, U end) -> range_proxy<typename std::common_type<T, U>::type> {
186+
using C = typename std::common_type<T, U>::type;
187+
return {static_cast<C>(begin), static_cast<C>(end)};
187188
}
188189

189190
template <typename T>

test.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ int main() {
6464
print_range(range(8.0, 1.0).step(-2.0));
6565
cout << "\n";
6666

67+
cout << "Mixed type inference:\n";
68+
print_range(range(0, sizeof "Hello"));
69+
cout << "Inferred as mangled type name "
70+
<< typeid(typename std::iterator_traits<decltype(range(0, sizeof "Hello").begin())>::value_type).name()
71+
<< " (expected: " << typeid(decltype(sizeof "Hello")).name() << ")\n";
72+
cout << "\n";
73+
6774
test_range_size(range(1, 8).step(2));
6875
test_range_size(range(8.0, 1.0).step(-2.0));
6976
test_range_size(range(8, 1).step(-2));

0 commit comments

Comments
 (0)