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

c++ - 通过 SFINAE GCC 错误测试 std::ostream operator<< 是否存在?

我决定亲自尝试一下Substitution Failure Is Not A Error (SFINAE) 代码,以测试是否operator<<为自定义类型定义了全局。

Stack Overflow 问题SFINAE + sizeof = detect if expression compiles already address testing for operator <<through SFINAE,但我的代码略有不同,产生了令人费解的结果。

具体来说,如果我尝试在SFINAE 模板代码之后operator<<为我的自定义类型(结构 A)定义,我下面的测试代码甚至不会编译——但是,据我了解,它应该可以正常工作,因为它是在 test_ostr 的任何实际实例化之前定义的班级。test_ostr

OTOH,如果我为一个甚至没有实例化或定义的不同类定义 a ,它将编译。但是,然后代码无法正确找到.operator<<test_ostroperator<<

此代码在 GCC 4.4.3 中编译和运行:

显示错误的输出:

这些是编译器错误吗?我错过了什么吗?不同编译器的结果是否不同?

0 投票
3 回答
811 浏览

c++ - 在 SFINAE 上下文中区分不明确的成员请求错误和成员不存在错误?

编辑:发布了我自己的答案,保留了原始接受的答案......让我想到了别名。

编辑:我的问题是针对在 SFINAE(或其他)上下文中区分歧义与成员 var/func 存在的可能性。我的问题不是关于如何制作 has_member 模板,而是关于检测歧义与存在之间的区别

是否可以设置部分特化来区分何时以不明确的方式访问成员(派生类的两个基类都有成员)与成员是否存在(派生类的基类都没有成员) ? 只有在检测到歧义时才需要返回 true ,但如果根本没有成员,或者它只存在于一个类中,则不需要返回 true。这是我到目前为止所拥有的,对于歧义返回true(我想要的),对于只有一个具有成员的类(也是我想要的)返回false,但是如果两个类都没有成员(啊!)

所需用途:

0 投票
2 回答
777 浏览

c++ - 类型名 C++ 错误

对不起,这个非常模糊的标题,很难描述。

我遇到的错误是这个,我不知道这意味着什么:

carray.h:176: 错误: 'typename Carray<T, Allocator>::is_iterator' 名称 'template<class T, class Allocator> template<class I, bool check> struct Carray<T, Allocator>::is_iterator',这不是一种类型

我有这个片段来检测某些东西是否是迭代器并使用正确的重载(http://stackoverflow.com/questions/6050441/why-does-this-constructor-overload-resolve-incorrectly)。这编译:

现在我想将实现与声明分开,我尝试了这个,但我得到了错误:

我正在使用 g++ 4.5.5。

0 投票
1 回答
116 浏览

c++ - 如果原始源代码行无法编译,是否可以让模板选择备用源代码行?

我正在寻找一个相对通用的:

  1. 尝试编译这行代码
  2. 如果成功,编译并使用那行代码。否则
  3. 使用其他一些代码行

我有一个案例,我想根据提供的仿函数在doubles 上是否有效来选择性地编译一些东西:

我以前从未使用过 SFINAE,但这是我的第一次尝试:

我认为在第一次重载时替换会失败(选择它是因为在传递双精度时它是一个更好的重载),然后该控制将继续进行第二次重载。但是,无论如何,整个事情都无法编译。

我正在尝试做的事情是合理的还是可能的?

0 投票
13 回答
23110 浏览

c++ - 如何检查 operator== 是否存在?

我正在尝试创建一个示例,它将检查operator==(成员或非成员函数)的存在。检查一个类是否有成员operator==很容易,但是如何检查它是否有非成员operator==

这就是我必须要做的:

是否可以编写一个测试函数来测试 non-member 的存在operator==?如果是,如何?

顺便说一句,我检查了类似的问题,但还没有找到合适的解决方案:
Is it possible to use SFINAE/templates to check if an operator是否存在?

这是我尝试过的:

但是如果非成员 operator== 被删除,编译会失败

0 投票
1 回答
494 浏览

c++ - 如何确定一个类是否包含子类/类型?

如果该类具有某些子类/类型,我们能否知道一个SFINAE技巧。就像是,

以下是示例:

我尝试了一些技巧,但主要是由于预期的编译器错误而失败。用法:

编辑:我重新编辑了我的问题,因为它似乎不可能my_type作为第二个参数传递给has_inner_type. 所以,到目前为止,问题是只找到一个特定类型作为my_type. 我已经尝试过这段代码,它不起作用。

0 投票
1 回答
546 浏览

c++ - 为什么在尝试类成员指针时 SFINAE 技巧不适用于非类类型?

出于好奇,我正在尝试使用该技巧的is_class构造的替代实现。sizeof()以下是代码:

问题是当我实例化时is_class<int>,它给出了编译错误:

现在,我的问题是,如果int T::*不适用于(int或等),那么void*为什么. 编译器不应该选择?yes checkno check

0 投票
3 回答
179 浏览

c++ - 为什么 SFINAE 会导致它应该工作的编译器错误?

我试图实现一个元程序,它会发现给定的指针类型是否const存在。IE

  • is_const<TYPE*>::value应该false
  • is_const<const TYPE*>::value应该true

以下是代码:

编译器错误消息是:

我的重点已转移到错误消息上。如果你看到最后一行:

如果我们真的替换T = int*然后TYPE = int*它真的应该匹配适当的函数(char check())。我很想知道这里出了什么问题。

0 投票
1 回答
1315 浏览

c++ - 使用 static_cast 替换失败不是错误 (SFINAE) 问题

鉴于:

如果我尝试:

键盘给我一个静态演员的错误:

似乎应该说没有Hokey::render匹配。

当然,如果我提供一个有效的过载,一切正常。但是鉴于下面的代码,您取消注释该行,codepad chokes 再次

SFINAE不是说 - 在第一种情况下 - 渲染中的问题不应该是错误,而是缺少有效的渲染应该是错误?

0 投票
1 回答
8867 浏览

c++ - C1001:编译器发生内部错误

这应该是不言自明的。我正在尝试实现分发排序,而 MSVC 编译器正在崩溃。这似乎是与我的 SFINAE 检测成员函数有关的特定情况,如果我不将 indexert 传递给函数,也不替换 has_get_index,这似乎不会发生。如果我删除任何剩余的索引器重载,它也不会发生。getIndex() const如果 sortable 有成员,问题仍然存在。

(没有“上面列出的位置”)一个最小的测试用例是: