gpt4 book ai didi

c++ - 在 C 或 C++ 中,有没有办法在没有继承的情况下扩展类?

转载 作者:IT老高 更新时间:2023-10-28 22:34:11 26 4
gpt4 key购买 nike

有没有办法在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com