首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么tag_invoke模式需要Niebloid std::tag_invoke呢?

为什么tag_invoke模式需要Niebloid std::tag_invoke呢?
EN

Stack Overflow用户
提问于 2020-09-09 20:08:29
回答 1查看 700关注 0票数 12

这个问题假定您熟悉自定义点管理技术tag_invoke,这是在P1895R0中引入的。

可以根据P1895R0将定制点对象定义为:

代码语言:javascript
复制
inline constexpr struct foo_cpo {
    // simplified original by omitting noexcept forward and using auto arg
    auto operator()(auto const &x) -> decltype( std::tag_invoke(*this, x) ) {
        return std::tag_invoke(*this, x); // <--^-- here are the Niebloid
    }
} foo;

但是,鉴于这一技术的关键是直接处理对象,并将任何和所有的ADL委托给一个也是唯一一致的标识符tag_invoke,那么似乎可以通过简单的方法实现相同的效果,

代码语言:javascript
复制
inline constexpr struct {
    auto operator()(auto const &x) -> decltype( tag_invoke(*this, x) ) {
        return tag_invoke(*this, x); // no Niebloid. directly ADL call tag_invoke
    }
} foo;

例如,来自P1895R0的类型擦除示例,即https://godbolt.org/z/3TvO4f,可以在不使用Niebloid的情况下重新实现:https://godbolt.org/z/dzqE7b。代码与原始代码相同,模块化了Niebloid std::tag_invoke的定义,并对所有定制点对象使用了上述ADL表单。

Niebloid的存在真正满足tag_invoke的要求是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-10 21:41:24

我不认为tag_invoke本身是一个函数对象是绝对必要的。但是,把它定义为一个物体可以给我们一个方便的地方,如果我们认为这是必要的话,就可以放置毒丸过载。通常情况下,作为一流公民的函数可以传递到高阶函数,这是很好的。就这样,真的。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63818871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档