问题标签 [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 投票
2 回答
207 浏览

c++ - 检测类型的存在

SFINAE允许我们检测一个类型是否具有某些数据成员或成员函数。它也可以用来检测一个类型是否存在吗?背景:我想知道是否<vector>包括在内。

0 投票
5 回答
5356 浏览

c++ - 如何检查模板参数是否为迭代器类型?

问题是:如何使五个断言语句通过?

0 投票
5 回答
1637 浏览

c++ - SFINAE 编译器问题

我的以下代码应该检测是否Tbeginend方法:

这是一些测试代码:

在 g++ 4.5.1 上,输出为1 1 1 1. 但是,在 Visual Studio 2008 上,输出为1 1 0 0. 我做错了什么,或者这只是一个 VS 2008 错误?任何人都可以在不同的编译器上进行测试吗?谢谢!

0 投票
1 回答
1923 浏览

c++ - 检查模板参数是否有成员函数

可能重复:
是否可以编写 C++ 模板来检查函数是否存在?

这与我之前的问题非常相似。我想检查模板参数是否包含成员函数。

我尝试了类似于上一个问题中接受的答案中的代码。

但我不知道我应该用什么来代替???它来让它工作。我是 SFINAE 概念的新手。

0 投票
3 回答
742 浏览

c++ - SFINAE 方法比较

member_func以下代码显示了一个 SFINAE 实现,用于在编译时检查类型(基本上是类)是否包含成员函数。

但是我的问题是您更喜欢哪种方法(方法 1 或方法 2),为什么?
您在给定的方法中是否发现任何不一致之处?如果是,请告诉我。

PS:假设sizeof(char)!= sizeof(long)

0 投票
3 回答
4595 浏览

c++ - 是否可以使用 SFINAE/模板来检查运算符是否存在?

我正在尝试检查编译时是否存在运算符,如果不存在,我只想忽略它,有什么办法吗?

示例运算符:

0 投票
6 回答
2334 浏览

c++ - SFINAE 并检测 C++ 函数对象是否返回 void

我已经阅读了有关这方面的各种权威,包括Dewhurst,但还没有设法解决这个看似简单的问题。

我想要做的是调用一个 C++函数对象,(基本上,你可以调用的任何东西,一个纯函数或带有 () 的类),并返回它的值,如果它不是 void,否则返回“true”。


更新

感谢您的想法和想法!

基于此,我实际上决定将我所有的模板提升到一个级别 - 所以我有:

和泛型类来携带各种对象和方法。感谢 Ree 先生将我推向那个方向的代码!

0 投票
2 回答
544 浏览

c++ - 将成员函数存在的检查调整为函数参数

我一直在尝试调整 解决方案以实现普通(非成员)函数的存在。就我而言,我有很多全局字符串实用程序类型函数,它们采用任何字符串类型 T ,例如 T 有一个char const* c_str() const成员函数。

目标是消除奇怪的编译器错误消息,如果用户尝试传递一些没有c_str()成员函数的类型 T,即,而不是编译器说“c_str():没有这样的成员函数”,我宁愿编译器说, "foo(T&): no such function" 哪里foo是全局函数。

这是改编后的代码:

但是,如上所示,编译器没有“看到” f(S&)-- 为什么不呢?

0 投票
2 回答
1015 浏览

c++ - SFINAE:检测类是否有自由功能

有没有办法使用 SFINAE 来检测给定类的自由函数是否重载?

基本上,我有以下解决方案:

简单的重载call是行不通的,因为实际上有很多foobar类型,并且call函数不知道它们(基本上call在 a 内部,用户提供自己的类型)。

我不能使用 C++0x,我需要一个适用于所有现代编译器的工作解决方案。

注意:不幸的是,类似问题的解决方案在这里不起作用。

0 投票
2 回答
503 浏览

c++ - 格式错误的 C++0x 代码或编译器错误?

在以下 C++0x 代码中,我尝试通过使用克隆成员函数(如果存在)来克隆对象并使用复制构造函数:

这个想法是使用 auto...->decltype(expr) 来清除格式错误的表达式,作为模板参数推导 (SFINAE) 的一部分,并通过第二个函数的部分排序来解决两个克隆函数模板之间可能存在的歧义范围。

不幸的是,GCC 4.5.1 不接受这个程序:

现在,问题是,这是一个编译器错误还是我错误地认为 SFINAE 在这里适用?我会很感激一个有充分理由的答案。

编辑: 如果我因为重载解析而更改decltype(new T(*ptr))代码T*编译,在这种情况下更喜欢第一个函数模板。但这违背了将表达式作为函数声明的一部分的目的。目的是让编译器在发生错误时将函数踢出重载决议集。