问题标签 [enable-if]

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 回答
118 浏览

templates - 启用 if 以检查传递的类型是否为兼容函数?

考虑以下代码:

执行提供的功能。

要使用 SFINAE,我想检查函数是否满足以下条件:

  • 它需要一个可转换为的参数const unsigned int
  • 它返回可转换为std::string

我必须写什么而不是/*SOMETHING*/

0 投票
2 回答
1472 浏览

c++ - enable_if 用于非模板化成员函数

《C++ 编程语言》一书(第四版)。第 28.4 章(第 796 页)解释了 enable_if 并给出了使 operator->() 的定义成为条件的示例。书中的例子只是一个代码片段,我将其完成为一个程序如下:

上面的代码不能在 gcc 4.7.2 中编译。编译器抱怨:错误:'struct std::enable_if' 中没有名为 'type' 的类型

根据书中的解释,如果 T 不是类,则 operator->() 将被忽略。但是,这并不能解释编译错误。编译错误表明相反,即使 T 不是类,也不会忽略 operator->() 的定义。这篇文章 std::enable_if 似乎解释了编译错误,以有条件地编译成员函数。但该帖子似乎与书中的解释不一致。任何人都可以帮助解释成员函数的 enable_if 的用法吗?在上面的例子中,如果我只想在 T 是类时定义 operator->(),有没有一个干净优雅的解决方案?谢谢你。

非常感谢您的回复。还有另一种基于重载的解决方法(我不会说它比其他发布的解决方案更好)

0 投票
1 回答
3026 浏览

c++ - 如何在转换运算符中使用 std::enable_if?

基本上我希望我的范围类型可以隐式转换Range<const char>Range<const unsigned char>. std::enable_if 似乎是不可能的,因为该函数没有参数并且没有返回。解决方法是什么?

这基本上是我尝试过的:

0 投票
0 回答
30 浏览

templates - 允许编写具有可选特征 typedef 的模板类的规则是什么,例如 unique_ptr 删除器中的指针

*unique_ptr* 在删除器中管理可选项的方式typedef foo_type pointer;让我感到惊讶。我查看了 Visual Studio 2012 的实现,并为示例剥离了一个小实现:

现在,如果我们能够这样写: struct A { typedef unsigned int Type; }; 结构 B { };

令人惊讶的是,MyFn在我们在内部使用 B 的情况下,ResolveType由于typename B::Type不存在而形成的病态。

所以我有三个问题: 1. 这是标准行为还是非标准技巧只能在 Visual Studio 编译器中正常工作?2. 如果这是正确的标准行为,那么黑魔法背后的规则是什么?3.这是否与*enable_if*有关,因为我也很难理解它如何允许拒绝函数重载的逻辑,有点像上面的例子一样,通过使签名无效?

谢谢。

0 投票
3 回答
715 浏览

c++ - 检查 C++ 中是否存在全局运算符<<

你好我想写两个to_string成员函数的实现如下:

我见过这个,但是我不知道如何使用代码,我根本不习惯 enable_if 和 boost mpl。我应该如何定义两个 to_string 函数以将第二个函数用作后备?

谢谢。

0 投票
2 回答
2785 浏览

c++ - `std::enable_if` 是函数指针 - 如何?

如果用户将函数指针作为参数传递,我想使用 SFINAE 启用特定模板。

我四处搜索,但一无所获——我也尝试查看<type_traits>文档,但找不到任何类似于is_function_ptr<T>.

函数指针是指全局函数指针,例如TReturn(*)(TArgs...).

0 投票
2 回答
994 浏览

c++ - std::enable_if 的第二个参数有什么用?

我对 std::enable_if 的第二个参数感到困惑。在使用 int 的返回类型时,我们可以使用:

但是如何在参数或模板中使用 enable_if 呢?在这种情况下,下面的too函数有什么区别:

谢谢。

0 投票
3 回答
983 浏览

c++ - SFINAE overload choice for has or has not operator<

Consider these two functions:

As the non-variadic overload has the priority over the variadic overload, I want to check whether the type has the operator<< with an std::ostream using std::enable_if in the first version.

So what should I write instead of /*HAS OPERATOR <<*/ ?


The following should work

(note you don't need to use std::enable_if in this case)

0 投票
1 回答
5469 浏览

c++ - 如何使用 std::enable_if 有条件地选择可变参数构造函数?

我正在尝试创建一个应该从其他类继承构造函数但不从这些类本身继承的类。

在我的类的初始化过程中,我想使用完美转发来创建一个其构造函数与给定参数匹配的类型的对象。

除了没有参数的默认构造函数外,不应有歧义。

这是我的代码:

我尝试了很多东西,但我就是无法让它发挥作用。

  • 在目前的方法enable_if中无法自动扣除模板args(我认为)
  • 由于我使用构造函数,因此无法enable_if在返回值上使用
  • 添加另一个默认参数enable_if将不起作用,因为构造函数是可变参数
  • 当我enable_if从函数参数中删除时,编译器会抱怨无效的重载(当然)

有没有优雅的方法来解决这个问题?

编辑: 标准允许的一种隐式转换不应该发生在我的课堂上。[示例代码编辑]

与上述示例一起使用的一种解决方案是定义一个可变参数构造函数并将参数完美地转发给条件初始化函数。但是,我想避免这种开销,因为成员需要默认构造,这在其他情况下可能不起作用。

(如果事情可以更清楚,请随时编辑问题)

0 投票
1 回答
1739 浏览

c++ - 当类型包含具有给定名称和类型的静态变量时启用_if函数

我正在努力完成标题中描述的事情。

但它无法编译:

如果 enable_if 失败,它不应该默认为第一个实现吗?我的意思是我在这里错过了什么,有人可以向我解释什么是错的,可能是什么解决方案。(我感觉问题出在这个幼稚的 decltype(T::_Foo) 上)