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

c++ - 为命名空间中的类专门化方法模板

我正在使用以下编译时“技巧”(基于 ADL)来创建一个仅由同一命名空间中的类有效/定义/调用的函数。

现在,我想使用这个原则(或类似的东西)来Foo::Bar为属于每个命名空间的类(例如Family1.

为了便于维护和每个命名空间中的大量类,如果可能的话,我想在不命名命名空间中的所有类的情况下执行此检查。

0 投票
2 回答
3223 浏览

c++ - 模板重载和 SFINAE 仅适用于函数而不适用于类

有人可以解释为什么编译器只接受这段代码

但不是这个:

编译器将第二个类模板视为对第一个类模板的重新定义。

0 投票
2 回答
1753 浏览

c++ - 这个 has_member 类模板是如何工作的?

我试图了解以下类模板的工作原理(取自此处),但我无法正确理解:

更具体地说,我不明白其中的目的BaseMixin和存在operator()。另外,既然Base是从它派生的,我也不明白。

更具体地说,当模板参数Type已定义时operator(),为什么只有SFINAE 被触发,导致第一个deduce()函数被忽略而选择第二个函数?


无论如何,这是我的测试代码:

输出(ideone):

0 投票
1 回答
1810 浏览

c++ - result_of 对我不起作用

两个 typedef 都给出错误

0 投票
3 回答
155 浏览

c++ - 根据参数类型制作模板功能代码的最简单方法是什么

我想编写一个模板函数来检查一些 Timestamp 属性(类继承自Timed),但也必须适用于没有时间戳的类型。我发现的最好(但仍然很丑)的解决方案如下:

这是一个功能的三个功能。有没有更简单的方法来实现这一点,例如使用boost::is_base_of或某事。在 if 条件或 boost::enable if 中类似,用于将函数输出转换为不派生自的类的一种常量Timed。不幸的是,具有虚拟功能的解决方案不是一种选择。

0 投票
2 回答
1899 浏览

c++ - 如何为模板化 operator() 编写最好的 is_callable 特征

我有这样定义的 is_callable 特征:

我的问题是如何检测没有参数且只有返回类型 T 的模板化 operator()

或者

我知道这种情况很少见,但我想问是否有任何方法可以检测没有参数且带有一个或多个模板参数的模板化 operator() 的存在。

0 投票
2 回答
854 浏览

c++ - is_container trait 在 std::set SFINAE 问题上失败

我正在尝试为 std 容器编写流运算符,主要是为了调试。

我有以下代码:

我知道这远非完美(赞赏有建设性的评论),但我遇到的问题是它适用于向量、双端队列和列表但无法在集合上匹配,我不知道为什么,因为集合仍然具有迭代器接口开始和结束。

谢谢。

编辑:在 g++ (GCC) 4.6.2 2012012 clang 版本 3.0 上测试

EDIT2:我使用 decltype 得到了它的工作,但是这是次优的,因为现在我不能断言它做了我期望的(返回一个迭代器)。

我不完全知道该集合首先返回的是什么,也许如果有人有一种调试 TMP 的方法会很好。

0 投票
3 回答
1507 浏览

c++ - SFINAE 区分有符号和无符号

我有将不同的算术类型转换为半精度浮点类型的函数(只是uint16_t在最低级别上),并且我对整数和浮点源类型有不同的函数,使用 SFINAE 和std::enable_if

这些是通过显式实例化从通用模板化构造函数内部调用的:

这可以编译并且也可以正常工作。现在我尝试通过用两个函数替换第二个函数来区分有符号整数和无符号整数:

但是一旦我尝试编译这个 VS2010 给了我

错误 C2995: "uint16_t math::detail::conversion::to_half( std::enable_if<std::tr1::is_integral<_Ty>::value && std::tr1::is_signed<_Ty>::value, T>::type )": 函数模板已定义。

因此,这似乎无法消除两个模板之间的歧义,但是对于浮点版本和整数版本显然没有问题。

但是由于我不是一个模板魔术师,所以我可能只是在这里遗漏了一些明显的东西(或者它实际上应该可以工作并且只是一个 VS2010 错误)。那么为什么这不起作用,如何在尽可能少的编程开销和仅标准功能的限制(如果可能的话)的情况下使其工作?

0 投票
2 回答
449 浏览

c++ - 为派生类专门化一个类模板方法

对于共享公共基类的类的以下代码段中的方法,我将不胜感激doIt(),如下所示

0 投票
5 回答
674 浏览

c++ - 为什么即使我有未定义的成员函数,以下代码也会编译?

我正在编写这段代码的一半,并认为在点击构建按钮之前这显然不会编译。我很惊讶它不仅可以编译,而且可以链接和工作。

如果我猜我会说 SFINAE 负责它的编译……是吗?

编辑:我正在使用 Visual-C++ 2008,也许这是 VS 的一个奇怪的怪癖