Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何隐藏range-v3的复杂范围类型?_C++_C++14_C++17_Range V3 - Fatal编程技术网

C++ 如何隐藏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:

我需要一个带有方法的类,该方法使用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::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
下!