Skip to content

Instantly share code, notes, and snippets.

@timshen91
Last active February 6, 2017 21:12
Show Gist options
  • Save timshen91/c939a7f3b295646e0cf049570d182027 to your computer and use it in GitHub Desktop.
Save timshen91/c939a7f3b295646e0cf049570d182027 to your computer and use it in GitHub Desktop.
#include <utility>
#include <vector>
template<typename UnderlyingRangeType>
struct some_range_view {
some_range_view(UnderlyingRangeType range) : storage_(std::forward<UnderlyingRangeType>(range)) {}
UnderlyingRangeType storage_;
};
template<typename UnderlyingRangeType>
// UnderlyingRangeType&& has more language magic in it, namely "forwarding reference".
some_range_view<UnderlyingRangeType> make_some_range_view(UnderlyingRangeType&& range) {
return some_range_view<UnderlyingRangeType>(std::forward<UnderlyingRangeType>(range));
}
int main() {
{
auto view = make_some_range_view(std::vector<int>());
static_assert(std::is_same<decltype(view.storage_), std::vector<int>>::value, "");
}
{
std::vector<int> v;
auto view = make_some_range_view(v);
static_assert(std::is_same<decltype(view.storage_), std::vector<int>&>::value, "");
}
{
const std::vector<int> v;
auto view = make_some_range_view(v);
static_assert(std::is_same<decltype(view.storage_), const std::vector<int>&>::value, "");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment