问题标签 [tag-invoke]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
459 浏览

c++ - 为什么 tag_invoke 模式根本需要 Niebloid std::tag_invoke?

这个问题假定您熟悉P1895R0tag_invoke中介绍的定制点管理技术。

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

但是考虑到这种技术的关键是直接处理对象,并将任何和所有 ADL 委托给一个且唯一商定的 identifier tag_invoke,那么似乎可以通过简单地实现相同的效果,

例如,P1895R0 中的类型擦除示例https://godbolt.org/z/3TvO4f可以在完全不使用 Niebloid 的情况下重新实现:https ://godbolt.org/z/dzqE7b 。该代码与原始逐字记录相同,以 Niebloid 的定义为模,并对std::tag_invoke所有自定义点对象使用上述 ADL 形式。

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

0 投票
1 回答
146 浏览

c++ - std 类型别名的自定义点

假设我正在lib命名空间中编写一些通用算法,该算法调用自定义点my_func

my_func 第一次尝试是为想要专门针对他的类型的用户使用 ADL my_func,这是std类型的别名。当然在他的命名空间中定义它是行不通的,因为 ADL 不适用于别名。std标准不允许在命名空间中定义它。剩下的唯一选项似乎在算法的命名空间中定义lib。但是,如果最终用户在包含自定义标头之前包含算法标头,这也不起作用。

https://godbolt.org/z/bfdP8s

第二次尝试是使用 niebloids my_func,这与 ADL 有相同的问题。

第三次尝试是 using tag_invoke,它应该与 ADL 有相同的问题,即

  • 在用户命名空间中自定义不起作用,因为我的类型是要std键入的别名
  • std不允许自定义
  • 命名空间中的自定义lib取决于标题包含的顺序 第一点似乎是正确的,但最后一点不是。这似乎有效

https://godbolt.org/z/hsKbKE

为什么这与第一个(原始 ADL)没有相同的问题?

第四次尝试是使用模板专业化,这似乎按预期正常工作

https://godbolt.org/z/r71x6c


编写通用算法和自定义点并允许客户端自定义 std 类型的别名的最佳方法是什么?

0 投票
1 回答
33 浏览

c++ - 类不能使用 boost::json 序列化自己

我写了一个小类,它依赖于 boost::json 来序列化自己。它无法编译,因为编译器听起来无法找到实现 json::value<=>myClass 翻译的 tag_invoke() 函数:

给出了这两个函数的实现:

但编译器似乎无法找到它们。

欢迎任何提示!谢谢