问题标签 [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.
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
?
c++ - std 类型别名的自定义点
假设我正在lib
命名空间中编写一些通用算法,该算法调用自定义点my_func
。
my_func
第一次尝试是为想要专门针对他的类型的用户使用 ADL my_func
,这是std
类型的别名。当然在他的命名空间中定义它是行不通的,因为 ADL 不适用于别名。std
标准不允许在命名空间中定义它。剩下的唯一选项似乎在算法的命名空间中定义lib
。但是,如果最终用户在包含自定义标头之前包含算法标头,这也不起作用。
第二次尝试是使用 niebloids my_func
,这与 ADL 有相同的问题。
第三次尝试是 using tag_invoke
,它应该与 ADL 有相同的问题,即
- 在用户命名空间中自定义不起作用,因为我的类型是要
std
键入的别名 std
不允许自定义- 命名空间中的自定义
lib
取决于标题包含的顺序 第一点似乎是正确的,但最后一点不是。这似乎有效
为什么这与第一个(原始 ADL)没有相同的问题?
第四次尝试是使用模板专业化,这似乎按预期正常工作
编写通用算法和自定义点并允许客户端自定义 std 类型的别名的最佳方法是什么?
c++ - 类不能使用 boost::json 序列化自己
我写了一个小类,它依赖于 boost::json 来序列化自己。它无法编译,因为编译器听起来无法找到实现 json::value<=>myClass 翻译的 tag_invoke() 函数:
给出了这两个函数的实现:
但编译器似乎无法找到它们。
欢迎任何提示!谢谢