c++ - 为什么 boost::adaptors::filtered 的输出没有名为 size 的成员?

标签 c++ boost functional-programming c++14 monads

以下虚拟程序编译并运行

#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <functional>
#include <utility>
#include <vector>

using boost::adaptors::filtered;
using boost::adaptors::transformed;
auto whatever = [](auto&& x){ return std::forward<decltype(x)>(x); };
auto whenever = [](auto&){ return true; };

int main() {
    std::vector<int> v{1,2,3};
    auto w1 = v | transformed(whatever);
    auto w2 = v | transformed(whatever) | filtered(whenever);
    w1.size();
    //w2.size();
}
取消注释注释行并尝试使用 g++ -std=c++14 that_file.cpp 进行编译会导致此错误:
uffa.cpp: In function ‘int main()’:
uffa.cpp:17:8: error: ‘struct
boost::range_detail::filtered_range<<lambda(auto:2&)>, const
boost::range_detail::transformed_range<<lambda(auto:1&&)>, std::vector<int> >
>’ has no member named ‘size’
   17 |     w2.size();
      |        ^~~~
由于 filtered 就像 transformed 一样,需要一个范围并返回一个范围,我不明白为什么 sizefiltered 的输出中不可用。
我知道 transformedfiltered 是两个不同的数学函数(例如,前者假设它的输入是一个仿函数,而后者假设,如果我错了,请纠正我,它的输入是一个单子(monad)),但仍然......在这里输入是 std::vector 那么询问 size 输出的 filtered 有什么问题?

最佳答案

转换范围时,大小不会改变。这意味着 transform可以知道大小将是多少,因为它与输入相同。
过滤范围时,您可能会或可能不会从范围中删除元素。这是懒惰地完成的,所以在您通过过滤范围之前,您无法知道它将有多大。如果你做一个非惰性过滤器,你可以知道,但范围应该是惰性的。

关于c++ - 为什么 boost::adaptors::filtered 的输出没有名为 size 的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65617373/

相关文章:

c++ - 在结构中创建未知数据类型数组?

c++ - 有没有办法在对象上保持弱引用并控制它的生命周期?

haskell - 为什么 Haskell 没有比 Eq 更强大的替代方案?

c++ - 在实现文件中包含注释类声明

c++ - C++ 字符串上的 < 和 > 是否反射(reflect)字母顺序?

c++ - 与 Boost 的正则表达式区分大小写的部分匹配

c++ - 如何将 boost::string_ref 与 std::string 进行比较

.net - 状态单子(monad),为什么不是一个元组?

functional-programming - LISP 中的 REVERSE 函数

c++ - 在主应用程序中声明的 dll 中实现接口(interface) - C++