问题标签 [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.

0 投票
3 回答
164 浏览

c++ - 使用 C++ 检测习语计算任意可调用对象的参数

我一直在使用 C++检测习惯用法创建一个元函数来确定任意可调用对象的参数数量。到目前为止,我有这个(完整的、可编译的代码在http://ideone.com/BcgDhv):

当所有可调用参数都不是左值引用时,这很有效:

但是当任何参数是左值引用时,这会失败(原因很明显,因为可调用原型有替换失败):

有谁知道如何概括这个想法以使其也适用于左值引用?

0 投票
0 回答
80 浏览

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”的成员

完整代码可在此处获得(在 wandbox 上)


假设我在正确的轨道上any_type,有没有办法忽略 lambda 的返回类型和 lambda 的主体?更详细地说:

  • 是否可以检查通用约束 lambda 是否是二进制的?

  • 是否可以检查尝试访问其参数的特定成员的通用 lambda 是否是二进制的?

否则,还有其他方法可以在这里工作吗?

0 投票
2 回答
1112 浏览

xaml - 网格列跨度的 OnIdiom

我需要使用 OnIdiom 进行网格列定义,但它不起作用。请参阅下面的代码。谁能告诉我我做错了什么并提出解决方案?

这没有帮助,所以我做了:

这也无济于事。

0 投票
0 回答
333 浏览

c++ - 为什么 type_identity 会破坏 is_detected 的实现

p0887r1

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_identityusing 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却没有?

0 投票
1 回答
72 浏览

c++ - SFINAE在禁止临时调用时检测操作

可以使用以下模式来检测是否可以将 x 应用于 T

如果x被定义为

现在CanDoX<Bar>::valuefalse,因为没有重载接受临时的。Bar val不知何故,在测试之前必须有一个x(val)

0 投票
0 回答
22 浏览

xamarin.forms - 使用 Xamarin Forms 在 VS for Mac 上使用 OnIdiom 的问题

我一直以同样的方式使用它,它总是有效的。更新后,我不断收到错误消息。有人可以帮我吗?

在此处输入图像描述

这是我得到的错误。 在此处输入图像描述

0 投票
0 回答
43 浏览

c++ - 是否可以编写一个特征来检测朋友类声明?

我想知道是否可以编写一个能够检测朋友类声明的特征。我对前向声明的情况特别感兴趣,如下所示:

请不要使用 Boost 或其他外部库。答案应该坚持标准(C++ 17)或自定义特征。