加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c 11:创建函数的最简单方法是返回true以用于函数参数

发布时间:2020-12-16 10:13:33 所属栏目:百科 来源:网络整理
导读:我想使用以下模板成员函数 template typename Entityclass SomeCollection{ // .... template typename Measure,typename Filter Entity maximalEntity(Measure measure,Filter requirement) { auto maxEntity = Entity(); auto maxValue = -std::numeric_li
我想使用以下模板成员函数

template <typename Entity>
class SomeCollection
{
    // ....

    template <typename Measure,typename Filter>
    Entity maximalEntity(Measure&& measure,Filter&& requirement)
    {
        auto maxEntity = Entity();
        auto maxValue = -std::numeric_limits<double>::infinity();

        for (auto ent /* some iteration method*/)
        {
            auto measurement = measure(ent);
            if (requirement(ent) && measurement > maxValue)
                std::tie(maxEntity,maxValue) = std::make_tuple { ent,measurement };
        }
        return maxEntity;
    }

    // ...
};

在没有Filter要求的情况下从客户端代码调用此函数的最佳方法是什么(只有最大元素)?

我能想到的最好的是:

class Something;
double measure(Something&);
SomeCollection<Something> collection;

auto maximum = collection.maximalEntity(measure,[](const Something&) { return true; });

但我猜这个lambda函数可以改进吗?

解决方法

不确定如何改进lambda,但是你可以定义一个通用的lambda,给定任何输入总是返回true(也可以在这里使用):

auto always_true = [](auto&&...) { return true; };

你会用它作为:

auto maximum = collection.maximalEntity(measure,always_true);

Live demo

C 11的等效实现如下:

struct always_true {
    template<typename... Args>
    bool operator()(Args&&...) const noexcept {
        return true;
    }
};

然后将用作:

auto maximum = collection.maximalEntity(measure,always_true{});

Live demo

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读