C++ 如何隐藏range-v3的复杂范围类型?
我需要一个带有方法的类,该方法使用range-v3库返回某种范围。 为了实现这样一个类,我可以在该类的定义中正确地编写它。例如:C++ 如何隐藏range-v3的复杂范围类型?,c++,c++14,c++17,range-v3,C++,C++14,C++17,Range V3,我需要一个带有方法的类,该方法使用range-v3库返回某种范围。 为了实现这样一个类,我可以在该类的定义中正确地编写它。例如: #include <iostream> #include <set> #include <range/v3/view/transform.hpp> class Alpha { public: int x; }; class Beta : public Alpha {}; class Foo { public: std:
#include <iostream>
#include <set>
#include <range/v3/view/transform.hpp>
class Alpha {
public:
int x;
};
class Beta : public Alpha {};
class Foo {
public:
std::set<Alpha*> s;
auto r() { return s | ranges::v3::view::transform([](Alpha* a) { return static_cast<Beta*>(a); }) }
};
实现,cpp文件:
#include "Foo.h"
Foo::RangeReturn Foo::r() {
return s | ranges::v3::view::transform(std::function<Beta*(Alpha*)>{
[](Alpha* a) { return static_cast<Beta*>(a); }
});
}
#include "Foo.h"
Iterable<Beta*> Foo::r() {
return s | ranges::v3::view::transform([](Alpha* a) { return static_cast<Beta*>(a); });
}
在cpp文件中:
#include "Foo.h"
Foo::RangeReturn Foo::r() {
return s | ranges::v3::view::transform(std::function<Beta*(Alpha*)>{
[](Alpha* a) { return static_cast<Beta*>(a); }
});
}
#include "Foo.h"
Iterable<Beta*> Foo::r() {
return s | ranges::v3::view::transform([](Alpha* a) { return static_cast<Beta*>(a); });
}
#包括“Foo.h”
Iterable Foo::r(){
返回s|ranges::v3::view::transform([](Alpha*a){return static_cast(a);});
}
我可以接受这样一个事实,即生成的Iterable
类型可能包含由于隐藏过程而无法内联的实际函数调用。
链路时间优化可能会,也可能无法在以后对其进行优化
不幸的是,据我所知,这样的Iterable
只是一个概念,而不是库中的一个单独类型。您要查找的r()
的返回类型是ranges::v3::any\u view
注意,它应用了类型擦除,这意味着运行时性能可能会受到严重的损失。相关讨论:
现场演示:来自Range-v3的文档:
任意视图(rng)
-使用值类型T键入已擦除的元素范围;可以存储此值类型的任何范围。那不会有帮助吗?(我以前没有见过它,只是在谷歌上搜索了“range-v3类型擦除”:)。在我看来,这就像是类型擦除的例子。如果没有类型擦除,您将无法很好地拼写返回类型。与返回lambda的函数相同-要么键入擦除返回类型(std::function),要么定义必须在头中。我想说明它无法编译。。。。直到我意识到any_view
不在ranges::v3::view
命名空间中,而是直接在ranges::v3
下!