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

c++ - 从 enable_if 的基础继承

我正在尝试为非字符数组部分专门化一个特征:

Visual Studio 2010 给了我一个 C2039(type不是enable_if...的元素)。但是,SFINAE 不应该只是在这里触底而不是给出编译器错误吗?或者 SFINAE 不适用于这种情况?

当然,我可以将 non-char 和 char 的特化分开:

但我真的很想知道为什么 SFINAE 在这种特殊情况下不起作用。

0 投票
3 回答
1530 浏览

c++ - 是否可以根据模板类型参数的嵌套 typedef 的存在来专门化模板定义?

我有一个模板,template <typename T> class wrapper我想根据typename T::context_type. 如果typename T::context_type已声明,则wrapper<T>实例化的构造函数和赋值运算符重载应接受强制typename T::context_type参数。此外,wrapper<T>对象将在成员数据中存储“上下文”。如果typename T::context_type不存在,则构造函数和赋值运算符重载wrapper<T>将少一个参数,并且不会有额外的数据成员。

这可能吗?我可以在不更改 、 和 的定义的情况下编译以下config1代码config2main()

0 投票
1 回答
141 浏览

c++ - 将类型解析为 class::typedef 的更短方法

我有几节课。现在它们被一个符号分开。他们中很少有人包含type(a typedef),而且很少有人没有。

我想以这样的方式实现一个SFINAE类,

一种方法是使用基本 SFINAE,如上一个链接所示,它检查是否T包含 atype然后使用bool检查器。例如,

演示

问题:我在整个代码中有很多这样的实例,我觉得这种方法可能会大大增加编译时间。因为必须经过两次迭代:第一次用于查找type,第二次通过解析bool标志。

有没有更快的方法来减少编译时间?

[旁注:在这种情况下,我在andtype之间放置了分隔符。但是,我可以自由地将任何东西放在里面,将它与. 也欢迎与此相关的想法。]ABAB

0 投票
1 回答
4125 浏览

c++ - Boost MPL:仅在存在时调用(成员)函数

我有一个具有模板参数 T 的类 A。在某些用例中,类 T 提供了函数 func1(),而在某些用例中 T 不提供它。A 中的函数 f() 应该调用 func1(),如果它存在的话。我认为这应该可以通过 boost mpl 实现,但我不知道如何。这里有一些伪代码:

更好的是其他情况:

0 投票
1 回答
375 浏览

c++ - 在 SFINAE 中未继承类型以进行多重继承?

我正在使用SFINAE机制来推断类型。Resolve<T>::type推断为Tifclass T不包含yes并且推断为MyClassif it contains yes

现在,我有简单的测试类,

根据以下逻辑应该是上述测试的结果:

  1. Resove<B1>::type = MyClass
  2. Resove<B2>::type = MyClass
  3. Resove<D1>::type = D1
  4. Resove<D2>::type = MyClass
  5. Resove<D3>::type = MyClass编译器错误(由于 B1、B2 之间的歧义)

奇怪的是,在测试用例 (5) 中并没有发生这种情况。结果是,

谁能解释一下,多重继承特别发生了什么魔法?没有得到编译器错误是符合标准的行为吗?这是演示

0 投票
1 回答
3814 浏览

c++ - SFINAE 尝试使用 bool 给出编译器错误:“模板参数 'T::value' 涉及模板参数”

bool我尝试使用(不像流行的void_ 技巧)来实现 SFINAE :

目标是专门化其中static const bool my_value = true;定义的类。如果它们已定义false或未定义,则不要专门化它。IE

应用上述技巧时B1会出现编译错误:

错误:模板参数“T::my_value”涉及模板参数

我知道这可以通过其他方式来实现。但是,我有兴趣知道,为什么它会在这里给出编译器错误,并且可以在这段代码本身中解决它吗?

0 投票
4 回答
6331 浏览

c++ - 在编译时检测 typedef(模板元编程)

我目前正在做一些模板元编程。就我而言,我可以处理任何“可迭代”类型,即 atypedef foo const_iterator以相同方式存在的任何类型。我试图为此使用新的 C++11 模板元编程,但是我找不到一种方法来检测是否缺少某种类型。

因为我还需要根据其他特性打开/关闭其他模板特化,所以我目前使用的模板有两个参数,第二个是通过std::enable_if. 这是我目前正在做的事情:

exists如果没有帮助模板,我无法做这样的事情。例如简单地做

不起作用,因为在应该使用这种特化的情况下,无效的默认情况被实例化了。

但是我在新的 C++11 标准中找不到exists任何地方,据我所知,它只是从boost::type_traits这种东西中获取的。但是,在主页上forboost::type_traits没有显示对任何可以替代使用的任何内容的引用。

是否缺少此功能,或者我是否忽略了其他一些明显的方法来实现所需的行为?

0 投票
2 回答
253 浏览

c++ - C++ (03) SFINAE 方面的编译器是独立的吗?

我有一个文件,它的功能很大程度上依赖于 SFINAE 的成功。目前g++ 4.6它按预期工作。我是否应该假设,对于所有编译器(C++03 编译器),我的代码将以相同的方式无缝运行?

我发现这是一个问题,因为如果有什么不同,它不会导致编译器错误,并且会默默地改变代码流。

0 投票
2 回答
328 浏览

c++ - 排除使用显式构造的 std::pair 构造函数

this answer之后,似乎这些构造函数:

当它们需要显式转换时,它们被禁止参与重载决议。

从 C++11(§20.3.2,n3290)开始:

备注:此构造函数不应参与重载决议,除非 U 可隐式转换为 first_type 并且 V 可隐式转换为 second_type。

有人提出了一个有趣的SFINAE 解决方法,但这偏离了标准的文本。

如果没有一些特殊的内部编译器魔法,一个符合要求的实现怎么可能将其排除在重载决议之外?即一个实现可以做到这一点,我可以为我自己的类型复制它吗?似乎没有任何符合这一点的方法!这是从 C++11 中删除概念的后遗症吗?

我确实想知道使用私有构造函数来执行 SFINAE 部分并从公共构造函数委托,但它看起来不像构造函数委托以某种方式参与 SFINAE 以使其工作。

0 投票
6 回答
445 浏览

c++ - 检测是否可以在 C++ 中派生类型

我有以下模板类和其类型的(全局)变量:

我预计会出现编译错误,因为int无法派生,但这在 Visual C++ 2010 下编译得很好。

如果我删除指针,我会得到预期的编译错误(不能从 int 派生):

我想使用这个类进行 SFINAE 测试给定类型是否是可以派生自的类:

然而,这总是报告真实的,即使对于原始类型,例如int由于上述原因。这是 C++ 的预期/有效行为吗?