作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
有没有办法在 C 和/或 C++ 中实现类类别(Objective-C)或扩展方法(C# 3.0)等功能?
最佳答案
C++ 有自由函数,但有时将多个函数嵌套在一起时,扩展方法会更好地工作。看看这段 C# 代码:
var r = numbers.Where(x => x > 2).Select(x => x * x);
如果我们使用自由函数在 C++ 中编写它,它看起来像这样:
auto r = select(where(numbers, [](int x) { return x > 2; }), [](int x) { return x * x; });
这不仅难读,而且难写。解决这个问题的常用方法是创建所谓的 pipable 函数。这些函数是通过重载 |
管道运算符(实际上就是 or 运算符)创建的。所以上面的代码可以这样写:
auto r = numbers | where([](int x) { return x > 2; }) | select([](int x) { return x * x; });
这更容易阅读和写作。许多库对范围使用 pipable 函数,但它也可以扩展到其他类。 Boost 在他们的 range 中使用它图书馆, pstade oven使用它,还有这个 C++ linq图书馆也使用它。
如果您想编写自己的 pipable 函数,请解释如何执行此操作 here .但是,其他库提供了功能适配器以使其更容易。 Pstade 鸡蛋有一个 pipable adaptor , 并且 linq 提供了 range_extension
适配器来为范围创建一个 pipable 函数。
使用 linq,您首先只需将函数创建为函数对象,如下所示:
struct contains_t
{
template<class Range, class T>
bool operator()(Range && r, T && x) const
{ return (r | linq::find(x)) != boost::end(r); };
};
然后你像这样使用静态初始化来初始化函数:
range_extension<contains_t> contains = {};
然后你可以像这样使用你的 pipable 函数:
if (numbers | contains(5)) printf("We have a 5");
关于c++ - 在 C 或 C++ 中,有没有办法在没有继承的情况下扩展类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926066/
我是一名优秀的程序员,十分优秀!