问题标签 [sfinae]

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 回答
341 浏览

c++ - 我可以在控制流语句中使用 SFINAE 测试吗?

我有一个 SFINAE 测试来检查一个类是否有一个功能。测试工作正常,但是当我尝试在 if 语句中使用它时出现编译器错误。

我在第二行得到“错误:'class Node'没有名为'setInstanceKey'的成员”,即使应该执行else子句。

有没有办法使这项工作?

谢谢。

0 投票
1 回答
1307 浏览

c++ - 使用 sfinae 测试命名空间成员的存在

我试图弄清楚是否可以使用 sfinae 来测试命名空间成员的存在。谷歌对此相当沉默。我已经尝试了以下代码,但它失败了。

知道为什么吗?

问候,

0 投票
3 回答
239 浏览

c++ - 为什么类模板的成员函数声明都应该格式正确?

好的,假设我想检查模板参数是否有嵌套类型/typedef XYZ。

工作正常,正如预期的那样。

现在考虑一下:

hasXYZ<int>现在导致编译时错误。好的, f 不是模板函数。但另一方面,当hasXYZ为 int via 实例化时,编译器可以很容易地从候选列表中hasXYZ<int>::value排除。f(int::XYZ*)我只是不明白为什么类模板中成员函数声明的实例化失败一定会导致整个类实例化失败。有任何想法吗?

编辑:我的问题是:为什么成员函数声明都是格式正确的?由于编译器仅在使用方法时才实例化方法,为什么需要正确声明。将上述示例 2 视为此功能的可能用例。

0 投票
1 回答
358 浏览

c++ - gcc上静态成员变量编译错误的概念检查

我正在尝试应用http://www.drdobbs.com/tools/227500449中描述的技术

使用下面的示例代码,我期望输出:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

如果我使用 clang 编译确实会发生这种情况。但是使用 gcc,此代码会出现以下错误:

我正在使用 gcc 4.5.1... 我看起来 gcc 没有遵循正确的 SFINAE 规则,但我不是 100% 确定。铿锵声是否正确,这是一个 gcc 错误?

0 投票
1 回答
958 浏览

c++ - 方法编译时断言;还是行不通

我需要一种简单的方法来在模板内断言模板参数实现了一个方法(或其父类之一)。我读过概念检查库,但很难找到一个简单的例子来做像这样的简单检查。

我尝试关注其他帖子(比如这个另一个),我已经对其进行了修改,因此我可以使其适用于许多方法类型(在我的示例中 Foo (methodName) 和 has_foo (Checker name) 将,一次正常工作,被包装为宏参数,因此它可以用于任何方法)

我目前拥有的代码是这个:

当我编译这个示例代码时(g++ 4.4.3 ubuntu 带有 -std=c++0x 选项,所以 static_assert 被识别)我得到这个:

就在那儿等一下,(注意 Connector< Bla1 > a 已被评论)我的第一个问题是:

1)我是否正确假设如果正在评估断言,则正在实例化包含模板?

编辑:由 GMan 回答:在解析期间评估 static_assert,而不是在实例化模板时评估。用 sizeof(TypeToBeChecked)==0 替换 false 使其绑定到编译时

2)我是否正确假设由于连接器模板类中的静态断言正在实例化带有 int(int, double) 签名的 has_foo,那么不应实例化单参数和无参数的特化?我的假设有什么问题?

编辑:这个假设是正确的,但现在我根据 1) 的答案进行了修复,实例化过程现在按预期运行

3)如果我取消注释 Connector< Bla1 > 一行,我希望它会失败(因为 Bla1 只有一个带有单个参数签名的 Foo 。但事实并非如此。知道可能出了什么问题吗?特别考虑到第一个链接的帖子

0 投票
1 回答
384 浏览

c++ - 如果模板类型是可实例化的,请执行某些操作

如果我可以实例化某个模板类,我想使用 SFINAE 模式来执行一些代码。让我们想象一下:

我怎么能那样做?

非常感谢!

编辑:根据 edA-qa mort-ora-y 的回答我试过:

但这会返回“启用启用”。我错过了什么?

0 投票
4 回答
1183 浏览

c++ - 为什么以下 SFINAE 测试无法检测到模板成员函数?

用 GCC 编译我总是从下面的代码中得到错误。我相信这是一个编译器错误,但有人可能知道得更好。

0 投票
1 回答
1518 浏览

c++ - 使用 decltype() 和 SFINAE 的错误

为了回应 .. 某处的其他问题,我编写了这段代码。

现在在我看来,如果 T 提供了一个接受双右值和模板参数文字的非静态成员函数“apply”,则结果应该为真,否则为假。但是,在编译时,给出的示例实际上无法为 B 类编译has_apply<B>。在 decltype 语句中替换 T 失败的事实不应该意味着它只是调用另一个函数吗?这不是 SFINAE 的重点吗?

以最荒谬、最无意义的方式解决:

0 投票
4 回答
7355 浏览

c++ - 如何使用 enable_if 根据类的模板参数启用成员函数

在代码中:

我收到一个错误:

显然我不明白如何使用enable_if. 我在想的是,我可以在编译期间从一组成员函数中启用一个或第二个成员函数,但它不起作用。谁能向我解释如何正确地做到这一点?
已编辑
我真正无法理解的是为什么typedef其中一个 def 中没有。编译器找不到它,它不会编译它。

0 投票
2 回答
864 浏览

c++ - SFINAE 的问题

为什么 SFINAE 规则无法解析此代码(M 类中的 fnc 值)?我收到一个错误:

当然 type 不是成员,它没有在 enable_if 的这个通用版本中定义,但是如果 bool 为真,则启用 fnc 的这个版本,如果它为假,则不实例化它,这不是背后的全部想法吗?请有人向我解释一下吗?