问题标签 [detection-idiom]
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++ - 使用 C++ 检测习语计算任意可调用对象的参数
我一直在使用 C++检测习惯用法创建一个元函数来确定任意可调用对象的参数数量。到目前为止,我有这个(完整的、可编译的代码在http://ideone.com/BcgDhv):
当所有可调用参数都不是左值引用时,这很有效:
但是当任何参数是左值引用时,这会失败(原因很明显,因为可调用原型有替换失败):
有谁知道如何概括这个想法以使其也适用于左值引用?
c++ - 检测可调用对象是否为二进制(包括通用约束 lambda)
我正在尝试检测可调用对象是否是二进制的(即,如果它operator()
有两个参数)。我想对 lambdas 执行此检查,包括泛型 lambdas和受约束的泛型 lambdas (例如,带有尾随std::enable_if_t
返回类型)。
注意:这不是"arity of a generic lambda"的副本。我只关心检查泛型 lambda 是否是二进制的,我已经可以为不受约束的泛型 lambda或不使用其 body 中的参数的泛型 lambda 做到这一点。
我目前的方法包括应用Kris Jusiak 的 Boost.DI C++Now 2015 演讲中描述的一种技术:any_type
. 它基本上是一个可以隐式转换为任何其他类的类。
定义后any_type
,我使用检测习惯来检查是否可以使用两个参数调用特定的可调用对象:
这种方法适用于非泛型和泛型 lambda...
...但是当使用不受 lambda 支持的接口any_type
或当 lambda 受到约束时访问参数时,会严重失败:
错误:静态断言失败
错误:“struct any_type”没有名为“something”的成员
假设我在正确的轨道上any_type
,有没有办法忽略 lambda 的返回类型和 lambda 的主体?更详细地说:
是否可以检查通用约束 lambda 是否是二进制的?
是否可以检查尝试访问其参数的特定成员的通用 lambda 是否是二进制的?
否则,还有其他方法可以在这里工作吗?
xaml - 网格列跨度的 OnIdiom
我需要使用 OnIdiom 进行网格列定义,但它不起作用。请参阅下面的代码。谁能告诉我我做错了什么并提出解决方案?
这没有帮助,所以我做了:
这也无济于事。
c++ - 为什么 type_identity 会破坏 is_detected 的实现
2.3 基本元功能构建块
类型特征有两个普遍的习语:
- 使用给定值定义公共数据成员值
- 定义一个命名给定类型的公共成员 typedef 类型
令人惊讶的是,有一个标准实用程序提供前者 (
std::integral_constant
),但没有标准实用程序提供后者。type_identity
是这个实用程序。它是其他元功能可以简单继承的基本构建块。例如,remove_const
可以如下实现:
它的实现很简单:
因此,我尝试type_identity
在我的代码中广泛使用,包括Detection Idiom的个人实现:
它在任何地方都可以正常工作,直到我将 libcxx 的测试套件用于我自己的实现 is_destructible
,以下是失败案例:
现场演示:
prog.cc:83:47:错误:“~ProtectedDestructor”是“ProtectedDestructor”的受保护成员
使用 has_dtor = decltype(std::declval().~U()); ^ prog.cc:26:19:注意:在此处请求的模板类型别名“has_dtor”的实例化中
prog.cc:45:1:注意:在模板类 'detail::detector 的实例化中
……
奇怪的是,一旦用 trival 替换type_identity
,using type = ......
编译器就没有错误,demo。对于其他琐碎的has_member
检查,type_identity
工作正常,演示。
所以,这里唯一的问题是,对于受保护的 dtor,type_identity
将强制 structdetail::detector
检查 dtor 的有效性,而using type = something
不会。
我认为解决方案很简单,只需删除type_identity
,然后 using type = something
直接使用,就像Walter E. Brown 的原始实现一样。但问题是:
为什么会type_idintity
在这里打破,而琐碎using type = something
却没有?
c++ - SFINAE在禁止临时调用时检测操作
可以使用以下模式来检测是否可以将 x 应用于 T
如果x
被定义为
现在CanDoX<Bar>::value
是false
,因为没有重载接受临时的。Bar val
不知何故,在测试之前必须有一个x(val)
。
c++ - 是否可以编写一个特征来检测朋友类声明?
我想知道是否可以编写一个能够检测朋友类声明的特征。我对前向声明的情况特别感兴趣,如下所示:
请不要使用 Boost 或其他外部库。答案应该坚持标准(C++ 17)或自定义特征。