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

c++ - 如果存在,如何调用模板化函数,否则如何调用?

我想做类似的事情

我认为使用enable_if的东西可以在这里完成工作,foo分成两部分,但我似乎无法弄清楚细节。实现这一目标的最简单方法是什么?

0 投票
2 回答
590 浏览

c++ - 为什么 SFINAE 不适用于此?

我在尝试 Visual Studio 10(Beta 2)时正在编写一些简单的点代码,并且我已经在我希望 SFINAE 启动的地方找到了这个代码,但它似乎没有:

这给error C2512: 'point<T>::point' : no appropriate default constructor available

鉴于它是一个测试版,我用在线 Comeau 编译器做了一个快速的健全性检查,它同意一个相同的错误,所以看起来这种行为是正确的,但我不明白为什么。

在这种情况下,一些解决方法是简单地内联decltype(T() / U()), 给点类一个默认构造函数,或者在完整的结果表达式上使用 decltype ,但是我在尝试简化使用 op_div 版本时遇到的错误时遇到了这个错误不需要默认构造函数*,所以我宁愿修正我对 C++ 的理解,而不是只做有效的事情。

谢谢!


*: 原本的:

这给出了error C2784: 'point<op_div<T,U>::type> operator /(const point<T> &,const U &)' : could not deduce template argument for 'const point<T> &' from 'int',也给出了point<T> / point<U>过载。

0 投票
2 回答
304 浏览

c++ - How can I have optional default constructor?

This class:

won't compile if T doesn't have default constructor. This one:

won't have default constructor even if T has default constructor.

I want to have both - If there's no T() I want no A().

I know that SFINAE have to be used. And that Boost.traits and Boost.enable_if can help, but I can't get it to work. Can Someone give me an example to this simple case?

0 投票
4 回答
13261 浏览

c++ - SFINAE 检查继承的成员函数

使用 SFINAE,我可以检测给定类是否具有某个成员函数。但是如果我想测试继承的成员函数怎么办?

以下在 VC8 和 GCC4 中不起作用(即检测到A有一个成员函数foo(),但不是B继承一个):

那么,有没有办法测试继承的成员函数?

0 投票
1 回答
287 浏览

c++ - SFINAE可以添加模板问题

我正在尝试编写一个 SFINAE 模板来确定是否可以将两个类添加在一起。这主要是为了更好地理解 SFINAE 的工作原理,而不是出于任何特定的“现实世界”原因。

所以我想出的是

除了最后一行之外,这将编译所有内容,这给出了

所以这个错误是我所期望的,但我希望编译器然后找到 test_sfinae( ... ) 定义并使用它(而不是抱怨不解析的那个。

显然我错过了一些东西,我只是不知道它是什么。

0 投票
2 回答
2650 浏览

c++ - SFINAE + sizeof = 检测表达式是否编译

我刚刚发现了如何检查是否operator<<为类型提供了。

这个技巧是众所周知的,还是我刚刚获得了元编程诺贝尔奖?;)

编辑:我通过两个全局函数模板声明lvalue_of_typervalue_of_type.

0 投票
1 回答
1549 浏览

c++ - 如何确定一个类是否具有特定的模板化成员函数?

我想知道是否可以扩展 SFINAE 方法来检测类是否具有某个成员函数(如此处所述:

“C++ 中是否有一种技术可以知道一个类是否具有给定签名的成员函数?” 检查一个类是否具有给定签名的成员函数

) 支持模板化成员函数?例如,能够检测以下类中的函数 foo:

我认为可以为 foo 的特定实例执行此操作(例如检查是否void foo< 5 >()是成员),如下所示:

然后做foo_int_checker< some_class, 5 >::value检查是否some_class有会员void foo< 5 >()。但是在 MSVC++ 2008 上,这总是返回false,而 g++ 在该行给出以下语法错误test( sfinae< _t, &_t::foo< _n > > );

两者似乎都失败了,因为我试图从本身就是模板参数的类型中获取模板函数实例化的地址。有谁知道这是否可行,或者是否由于某种原因被标准禁止?

编辑:似乎我错过了::template让 g++ 正确编译上述代码的语法。如果我将获得函数地址的位更改为&_t::template foo< _n >然后程序编译,但我得到与 MSVC++ 相同的行为(value始终设置为false)。

如果我注释掉 的...重载test以强制编译器选择另一个,我会在 g++ 中得到以下编译器错误:

其中第 32 行是该enum { value = sizeof( test< _class >( 0 ) ) == sizeof( big ) };行。不幸的是,这似乎并不能帮助我诊断问题:(。MSVC++ 给出了一个类似的不伦不类的错误:

在同一条线上。

奇怪的是,如果我从特定类而不是模板参数获取地址(即,而不是&_t::template foo< _n >我这样做&some_class::template foo< _n >),那么我会得到正确的结果,但是我的检查器类仅限于检查单个类(some_class)的功能。另外,如果我执行以下操作:

然后打电话,f1< some_class >()然后我没有收到编译错误&_t::template foo< 5 >。这表明只有在 SFINAE 上下文中从本身是模板参数的类型中获取模板化成员函数的地址时才会出现问题。啊!

0 投票
2 回答
472 浏览

c++ - 为什么这样有效(模板,SFINAE)。C++

参考昨天的帖子,今天早上把我吵醒了。为什么这实际上有效?就函数test而言,这个函数没有主体,它怎么能做任何事情呢?我想知道这是为什么以及如何工作的?我真的很想看到你的答案。

提前感谢帮助了解这个非常有趣的现象。

0 投票
2 回答
347 浏览

c++ - 声明用于记录的类的模块名称

我目前正在向我们的日志库添加一些功能。其中之一是可以为一个类声明一个模块名,该类会自动预先添加到从该类中写入的任何日志消息中。但是,如果没有提供模块名称,则不会添加任何内容。目前我正在使用一个具有返回名称的静态函数的特征类。

可以使用辅助宏定义此类。缺点是模块名称必须在类之外声明。我希望这在课堂上是可能的。此外,我希望能够使用预处理器指令删除所有日志记录代码。我知道使用 SFINAE 可以检查模板参数是否具有某个成员,但由于其他人对模板不像我那么友好,因此必须维护代码,我正在寻找一种更简单的解决方案。如果没有,我将坚持使用特征方法。

提前致谢!

0 投票
3 回答
2668 浏览

c++ - 多个 SFINAE 规则

看了这个问题的答案,了解到SFINAE可以根据类是否有某个成员函数来在两个函数之间进行选择。它相当于下面的,只是 if 语句中的每个分支都被拆分为一个重载函数:

变成

我想知道是否可以扩展 SFINAE 来执行多个规则。相当于这样的东西:

这样的事情可能吗?

谢谢你。