问题标签 [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.
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_ostr
operator<<
此代码在 GCC 4.4.3 中编译和运行:
显示错误的输出:
这些是编译器错误吗?我错过了什么吗?不同编译器的结果是否不同?
c++ - 在 SFINAE 上下文中区分不明确的成员请求错误和成员不存在错误?
编辑:发布了我自己的答案,保留了原始接受的答案......让我想到了别名。
编辑:我的问题是针对在 SFINAE(或其他)上下文中区分歧义与成员 var/func 存在的可能性。我的问题不是关于如何制作 has_member 模板,而是关于检测歧义与存在之间的区别
是否可以设置部分特化来区分何时以不明确的方式访问成员(派生类的两个基类都有成员)与成员是否存在(派生类的基类都没有成员) ? 只有在检测到歧义时才需要返回 true ,但如果根本没有成员,或者它只存在于一个类中,则不需要返回 true。这是我到目前为止所拥有的,对于歧义返回true(我想要的),对于只有一个具有成员的类(也是我想要的)返回false,但是如果两个类都没有成员(啊!)
所需用途:
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。
c++ - 如果原始源代码行无法编译,是否可以让模板选择备用源代码行?
我正在寻找一个相对通用的:
- 尝试编译这行代码
- 如果成功,编译并使用那行代码。否则
- 使用其他一些代码行
我有一个案例,我想根据提供的仿函数在double
s 上是否有效来选择性地编译一些东西:
我以前从未使用过 SFINAE,但这是我的第一次尝试:
我认为在第一次重载时替换会失败(选择它是因为在传递双精度时它是一个更好的重载),然后该控制将继续进行第二次重载。但是,无论如何,整个事情都无法编译。
我正在尝试做的事情是合理的还是可能的?
c++ - 如何检查 operator== 是否存在?
我正在尝试创建一个示例,它将检查operator==
(成员或非成员函数)的存在。检查一个类是否有成员operator==
很容易,但是如何检查它是否有非成员operator==
?
这就是我必须要做的:
是否可以编写一个测试函数来测试 non-member 的存在operator==
?如果是,如何?
顺便说一句,我检查了类似的问题,但还没有找到合适的解决方案:
Is it possible to use SFINAE/templates to check if an operator是否存在?
这是我尝试过的:
但是如果非成员 operator== 被删除,编译会失败
c++ - 为什么在尝试类成员指针时 SFINAE 技巧不适用于非类类型?
出于好奇,我正在尝试使用该技巧的is_class构造的替代实现。sizeof()
以下是代码:
问题是当我实例化时is_class<int>
,它给出了编译错误:
现在,我的问题是,如果int T::*
不适用于(int
或等),那么void*
为什么. 编译器不应该选择?yes check
no check
c++ - 为什么 SFINAE 会导致它应该工作的编译器错误?
我试图实现一个元程序,它会发现给定的指针类型是否const
存在。IE
is_const<TYPE*>::value
应该false
is_const<const TYPE*>::value
应该true
以下是代码:
编译器错误消息是:
我的重点已转移到错误消息上。如果你看到最后一行:
如果我们真的替换T = int*
然后TYPE = int*
它真的应该匹配适当的函数(char check()
)。我很想知道这里出了什么问题。
c++ - 使用 static_cast 替换失败不是错误 (SFINAE) 问题
鉴于:
如果我尝试:
键盘给我一个静态演员的错误:
似乎应该说没有Hokey::render
匹配。
当然,如果我提供一个有效的过载,一切正常。但是鉴于下面的代码,您取消注释该行,codepad chokes 再次:
SFINAE不是说 - 在第一种情况下 - 渲染中的问题不应该是错误,而是缺少有效的渲染应该是错误?
c++ - C1001:编译器发生内部错误
这应该是不言自明的。我正在尝试实现分发排序,而 MSVC 编译器正在崩溃。这似乎是与我的 SFINAE 检测成员函数有关的特定情况,如果我不将 indexert 传递给函数,也不替换 has_get_index,这似乎不会发生。如果我删除任何剩余的索引器重载,它也不会发生。getIndex() const
如果 sortable 有成员,问题仍然存在。
(没有“上面列出的位置”)一个最小的测试用例是: