问题标签 [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 投票
3 回答
434 浏览

templates - 寻找在 `enable_if` 中使用的 `is_allocator` 类型特征

是否有一种“足够”可靠的方法来检测模板参数中的分配器。也就是说,我需要类似is_allocator类型特征的东西,它可以用于enable_if

假设有一个类模板future(带有模板参数T):

这里,_shared_value是一个std::shared_pointer<T>

0 投票
2 回答
1320 浏览

c++ - 如何在类模板中使用 boost::enable_if

我正在尝试使用 boost::enable_if 来打开/关闭类模板中的某些功能,但总是得到编译错误错误:在 struct boost::enable_if 中没有名为“type”的类型

我的片段:

但是以下类似的代码可以正常工作:

我想要实现的是基于类模板中声明的类型禁用/启用一些成员函数。实际上不需要模板成员函数。它们只是为 SFINAE 添加的。

有人可以帮忙吗??

谢谢!

0 投票
1 回答
2611 浏览

c++ - enable_if 有条件地包含成员函数

我有一个模板类,其类型是迭代器。我想根据我的模板参数的 iterator_category 启用/禁用特定的成员函数。operator--特别是,如果模板参数是双向迭代器,我想启用。我的尝试是这样的:

Clang 告诉我(大致):error: no type named 'type' in 'std::__1::enable_if<false, MyTemplateParameter>'; 'enable_if' cannot be used to disable this declaration

有没有办法完成我正在尝试的事情?

这是某些情况下的示例:

0 投票
2 回答
731 浏览

c++ - std::enable_if 作为构造函数的单个参数

我对模板元编程相当陌生,并且一直在研究一些概念 - 但是,我遇到的这个特定片段让我有点难过。

我在阅读它时假设如果有一个或多个 DATATYPES 参数,它会启用默认构造函数,但是经过测试,我得到的只是一个编译错误。

我会感谢任何帮助我理解这个片段的帮助,因为我理解 enable_if 应该做什么,但在这种情况下,我似乎无法理解实际发生的事情。

编辑:我想这不是“我如何实现这种特殊效果?”的问题。以及更多类似“此代码实际生成的内容,它是否符合我所理解的原作者的意图?”

0 投票
1 回答
755 浏览

c++ - 使用带有可变参数模板的条件定义

如果我有一个模板函数,它接受已知数量的模板参数,我可以使用该enable_if语句以及is_base_of限制合法类型之类的东西。例如:

现在假设我们想对可变参数模板做同样的事情——检查以确保所有类型都是特定基类的子类。

您将如何编写这个条件定义?

0 投票
2 回答
318 浏览

c++ - 无法在 VS .NET 2008 中使用 boost::enable_if 专门化成员函数模板

我正在尝试为两种不同类型的类专门化成员函数模板,如下所示:

而 GCC 4.8.2 编译代码,VS .NET 2008 吐出错误消息:

0 投票
1 回答
65 浏览

c++ - 无法匹配使用 boost enable_if 的模板方法

我使用的是 g++4.4.7,它给了我一个编译错误:错误:'serializer & tar'中的'operator&'不匹配</p>

如何实现专业化?

0 投票
1 回答
69 浏览

c++ - 为什么这个特征类不起作用,以测试一个类是否具有特定的 typedef?

编辑:

好的,我想通了。我使用false_typeandtrue_type作为enable_if我应该何时使用bool. :X

此外,我已经决定一个is_map_like班级会更好地检查是否value_type像,std::pair<const Tkey, Tmapped>。因此,我的新特征类如下所示:


我想创建一个is_map_like类型特征类来检查key_typemapped_type。我很难建立这个。现在我只想检查key_type. 到目前为止,我有以下内容:

value这里似乎总是回归false_type。据我了解,SFINAE 应该允许我test根据是否C::key_type可访问来选择正确的重载。

以下是我的测试方式:首先,一个专门使用enable_ifon的结构is_map_like

这是我在运行时的调用方式:

输出:

T 不是地图类型 T 不是地图类型

我究竟做错了什么?为什么 the test(typename C::key_type*)even for the map, which 确实有 a不使用key_type?还是我使用的问题decltype

还有额外的好处:有任何调试技术吗?我如何检查如何选择专业化,甚至在编译时获得关于扩展的验证?也许有特定于 VS 的扩展或编译时调试工具?

0 投票
4 回答
891 浏览

c++ - 在模板派生类中禁用方法覆盖

如果 T 不是某种类型,是否可以禁用Foo()派生类中的覆盖(通过或一些增强魔法),而不必为 编写模板特化?std::enable_ifclass Derived

加分项:如果 T 没有定义某种方法,是否可以禁用覆盖?

这是我的SSCCE:

更新:

感谢您提供出色的解决方案,但我无法使它们适应我的真实代码。以下示例应该更好地了解我要实现的目标:

0 投票
2 回答
1209 浏览

c++ - std::enable_if 在 Visual Studio 2013 中未按预期工作

我正在用 C++ 编写一个小型库,我只希望在模板以算术类型为模板的情况下实例化模板,并且我发现了以下问题:

如果我有以下定义Foo

我尝试按如下方式对其进行初始化:

我收到以下错误:

Foo<T, std::enable_if<std::is_arithmetic<T>::value>::type>::Foo( std::initializer_list<U> )[with T=int, U=int] 无法访问

我是std::enable_if在 TMP 中使用的新手,但根据cppreference.com看来这应该可以工作。我在这里缺少什么,或者这是 VS2013 的错误?