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

c++ - 检查模板参数是否为引用 [C++03]

我想在 C++03 中检查模板参数是否属于引用类型。(我们is_reference在 C++11 和 Boost 中已经有了)。

我利用了 SFINAE 以及我们不能有指向引用的指针这一事实。

这是我的解决方案

有什么特别的问题吗?谁能给我一个更好的解决方案?

0 投票
1 回答
255 浏览

c++ - 模板实例化混乱

这是我检查类是否具有成员函数的代码begin

如果我将chtin的第二个参数更改check(cht< Iter (fallBack::*)() const, &C::begin>*);&checker::begin,这不会改变代码的语义,因为cht的第二个模板参数总是checker由于这个enum {no = (sizeof(check<checker>(0))==sizeof(char))

但是代码更改现在会导致错误:

我想知道这种行为背后的原因是什么。

0 投票
1 回答
1366 浏览

c++ - 替换失败不是枚举的错误 (SFINAE)

有没有办法对枚举使用替换失败不是错误(SFINAE)?

然后,Do<B>();工作和Do<A>();失败。但是,当 iOption 不存在时,我可以提供默认行为。所以我把Do to DoOption的一部分分开。

现在,缺少的部分是DoesOptionExist<T>- 一种检查结构中是否存在 iOption 的方法。当然 SFINAE 适用于函数名称或函数签名,但不确定它适用于枚举值。

0 投票
3 回答
2166 浏览

c++ - enable_if 函数在不应该被定义的时候定义

作为一个实验,我正在尝试根据类模板参数创建一个没有参数的 void 成员函数更改行为:

但是,我得到:错误:重载“MyFunc()”的调用不明确。不应该只定义这些函数中的一个或另一个,因为除了 ! 在其中之一?

0 投票
5 回答
3208 浏览

c++ - boost::enable_if 不在函数签名中

这只是一个关于风格的问题:我不喜欢 C++ 的模板元编程方式,它要求您使用返回类型或为 SFINAE 的技巧添加一个额外的虚拟参数。所以,我想出的想法是将 SFINAE 东西放在模板参数定义本身中,如下所示:

这个例子让 g++ 抱怨:

../src/afg.cpp:10:97: 错误: 'template void asd()' 的重新定义</p>

SFINAE 本身可以工作,因为如果我删除例如带有disable_if的那个,编译器错误是:

../src/afg.cpp:15:12: 错误:没有匹配函数调用'asd()'</p>

这就是我想要的。

那么,有没有办法在函数的“正常”签名中完成 SFINAE,即返回类型 + 参数列表?

编辑:这最终是我要在真实代码中尝试的:

我使用 c++0x 的东西而不是 boost,因为只要我需要 c++0x 来使用模板参数的默认值,我认为没有理由使用 boost,它是它的前身。

0 投票
2 回答
543 浏览

c++ - SFINAE 测试来自另一个命名空间的自由函数

我试图想出一个技巧来测试是否std::isnan在预处理器中没有特殊的套管编译器定义,并想出了以下内容,我希望它可以正常工作。

原来它没有检测到它。我知道肯定std::isnan是在ideone上定义的,因为我手动测试过。

当我取消注释上面的标记行时,它就起作用了。

我在这里想念什么?什么解释了这种行为?

0 投票
1 回答
396 浏览

c++ - 有没有办法使用 SFINAE 来确定对模板化函数的调用是否会由于提供的类型而失败?

我有一个模板类,我使用它来提供一个方法,该方法将用于boost::lexical_cast将其std::string参数转换为模板中指定的类型,前提是可以进行词法转换。目前要检查是否有可能,我只是检查是否operator>>为所讨论的类型定义了。这是一个人为的例子,基本上说明了我在做什么:

到目前为止,这适用于我的代码:所有无法通过词法转换的类型都以第一个版本结束,所有其他类型以第二个版本结束,至少对于我的代码使用它的类型。我担心的是,我基本上是在假设只要目标类型是 InputStreamable ,那么 lexical_cast 就不会失败。lexical_cast的boost 文档概述了一些其他要求,我可能也应该检查这些要求,而不是创建一个复杂的enable-if并用来mpl::and_将这些条件串在一起,我想知道:有没有办法使用 SFINAE 直接测试对于给定的类型,该调用是否lexical_cast会失败,并且仅当它不会失败时才匹配专用模板?

我只见过测试函数或运算符是否存在的示例,但从未测试过调用具有给定类型的模板化函数是否会产生错误。

0 投票
6 回答
1703 浏览

c++ - 如何确定一个类型是否可以仅使用 const 引用来调用?

我想编写一个is_callable<F, Arg>定义value为的 C++ 元函数true,当且仅当类型 F 具有形式的函数调用运算符时SomeReturnType operator()(const Arg &)。例如,在以下情况下

我想is_callable<foo, int &>成为falseis_callable<foo, const int &>成为true。这是我到目前为止所拥有的:

这打印1and 1,但我想要0and1因为foo只定义void operator()(const int &).

0 投票
2 回答
622 浏览

c++ - 无法让 SFINAE 在功能检测器中工作

对于最近发布的一些问题,我一直在研究一些解决方案,其中原始提问者一直试图查询给定类中是否存在方法。我一直在尝试使用 SFINAE 方法开发解决方案,但不幸的是我一直空着。

这是我尝试的一种解决方案,该解决方案不适用于允许我们检测另一个类是否具有名为的方法的类function()

结果,如果您取消注释全部test功能,则继续显示为false. 注释掉该函数后,我得到一个编译器错误,即没有版本test可以接受int (&)[1]参数。我很好奇为什么declval<R>().function()似乎没有正确实例化。例如,如果我将其更改为非常明确的内容,declval<T>().function()那么它就可以工作。不幸的是,这不是 SFINAE,因为如果该类没有function()方法,而不是静默失败,我会收到编译器错误。

我敢肯定,我在这里缺少一些非常简单的东西。感谢您的任何帮助,您可以提供。

0 投票
4 回答
1052 浏览

c++ - SFINAE 可以检测到私有访问违规吗?

我想知道如果我测试某个班级的某个成员并且该成员是私人的,那么 sfinae 会做出什么反应?它会很难出错还是会说好的还是会以sfinae方式出错?