如何解决如何在没有最初定义的情况下为 range::view 定义类型?
我需要根据变量指定不同的范围::视图。如:
#include <ranges>
#include <vector>
auto main() -> int
{
std::vector<double> xs = { 1.0,2.0,3.0,4.0,5.0 };
auto x = int(0);
auto vi;
if(x == 0)
vi = xs | std::ranges::views::all;
else
vi = xs | std::ranges::views::drop(2);
}
但问题是 auto 无法确定类型,所以我需要定义它,因为我已经为 x 定义了 int 类型。 (auto x = int(0);
)。请问我该如何执行此操作?
解决方法
通常,您会希望通过在可以正确推断出 vi
之前不声明它来完全避免这种情况,这并不像您想象的那样具有约束力:
#include <ranges>
#include <vector>
#include <iostream>
template<typename RangeT>
void foo(const RangeT& vi) {
for(auto & v: vi) {
std::cout << v << "\n";
}
}
auto main() -> int
{
std::vector<double> xs = { 1.0,2.0,3.0,4.0,5.0 };
auto x = int(0);
if(x == 0) {
auto vi = xs | std::ranges::views::all;
foo(vi);
}
else {
auto vi = xs | std::ranges::views::drop(2);
foo(vi);
}
}
话虽如此,万一有人来到这里并且真的把自己画在角落里,仍然值得回答这个问题。
您可以使用 decltype()
来标识将要使用的类型,然后使用 std::variant<>
使 vi
成为可以容纳其中任何一个的类型:
#include <ranges>
#include <vector>
#include <variant>
#include <iostream>
auto main() -> int
{
std::vector<double> xs = { 1.0,5.0 };
auto x = int(0);
using vi_all = decltype(xs | std::ranges::views::all);
using vi_drop_2 = decltype(xs | std::ranges::views::drop(2));
std::variant<vi_all,vi_drop_2> vi;
if(x == 0)
vi = xs | std::ranges::views::all;
else
vi = xs | std::ranges::views::drop(2);
std::visit([](auto& vi){
for(auto& v: vi) {
std::cout << v << "\n";
}
},vi);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。