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

c++ - C++0x 类型推断与 boost::enable_if 混淆

我正在尝试编写一个通用过滤函数,该函数在多维数组(任意秩)中的给定采样坐标处执行线性插值。为此,我需要一个递归函数模板,它遍历数组的所有维度,直到找到一个值及其关联类型。我使用 boost::enable_if 来检测何时停止遍历维度。在我尝试将返回值/类型“渗透”到最顶层函数之前,它可以正常工作。为此,我尝试使用 C++0x 类型推断,但它似乎与 boost::enable_if 不能很好地混合。

我将问题分解为以下内容:

编译器(GCC 4.6)抱怨以下代码:

错误信息:

似乎 decltype 使用来自 test< T, I > 的返回值,即使它被指示使用 test< T, I - 1 > 的返回值。知道为什么会发生这种行为吗?现在,它想我会把整个东西变成一个仿函数......

0 投票
1 回答
8787 浏览

c++ - C ++ - 迭代元组和类型与常量参数的解析

我目前正在为元组编写算术运算符重载。运算符遍历元组以对其每个单独元素执行操作。以下是运算符 += 的定义:

不幸的是,当我尝试调用运算符时,GCC 4.6 无法决定它应该使用哪个重载。例如:

产生以下错误:

这很奇怪,因为std::enable_if条件应该拒绝不适当的呼叫。现在,我有以下解决方法,这实际上是我之前的实现。上述版本实际上是一种简化的尝试。

这可以按预期编译和工作。为什么简化版拒绝编译?谢谢。

0 投票
1 回答
3973 浏览

c++ - 我可以在成员函数上使用 boost::enable_if 吗?

我正在编写一个模板类,我想允许一个附加方法只存在于某个模板类型。目前该方法适用于所有模板类型,但会导致所有其他类型的编译错误。

更复杂的是,它是一个重载的 operator()。不确定我想做的事情是否真的可以在这里。

这是我现在拥有的:

我希望该T&版本始终可用,但该T const&版本仅在Utility2<BASE>有效时可用。目前,这两种方法都存在,但如果尝试使用 const 版本Utility2<BASE>无效,则会出现奇怪的编译错误。我宁愿有一个合理的错误,甚至是“没有这样的成员函数”错误。

这可能吗?

编辑:在阅读了 boost 文档之后,这是我想出的,它似乎有效:

因此,除非有人尝试将它与 Utility2 一起使用,否则该方法不存在,并且他们只能创建一个 Utility2,如果它对该 BASE 类型有效。但是当它对该 BASE 类型无效时,MyClass 不会浪费时间创建访问器方法。

0 投票
2 回答
678 浏览

c++ - C++ - 具有右值引用的函数模板特化的行为

我正在尝试实现条件指针取消引用功能。基本思路如下:

为了限制必要专业化的数量,我尝试在arg不是指针的情况下使用右值引用。这是我当前的实现(std::cout仅用于调试目的):

现在,我在 GCC 4.6 下得到了一个相当奇怪的行为。第一个重载用于非指针类型和指针类型。显然,当使用指针类型时,它与第二个重载冲突。如果我注释掉第二个并使用第一个调用以下...

...相应的控制台输出为:

在同一上下文中,非指针类型(根据std::is_pointer)怎么可能也是指针类型(根据)?typeid由于std::is_pointer错误地报告p为非指针类型,两个重载之间会出现冲突。此外,当我在第一次重载中将 r 值引用替换为标准引用时:

它不再与第二次重载冲突......我只是不明白发生了什么。顺便说一句,使用第二个重载会产生(正如预期的那样):

谢谢你的帮助。

0 投票
4 回答
2065 浏览

c++ - enable_if'ed 模板化模板构造函数的类型签名?

我通常声明我的类和模板,然后定义它们的方法(当然是在同一个头文件中)。我只是觉得这样更容易阅读。好吧,我遇到了一个案例,我无法确定在类外定义中使用的工作类型签名。这是我正在做的一个简化示例,它说明了问题:

我在WHAT_GOES_HERE插槽中尝试了很多方法来尝试获得匹配的签名,但我一直失败。我需要 enable_if 来区分一个传入两个 T 类型对象的情况,以及一个传入一对迭代器的情况。如果模板化的构造函数是在主模板中定义的,则代码可以正常工作,这就是代码当前的工作方式,但我更愿意将定义移到声明之外。

编辑:我应该提一下,我不能只在定义中重复使用 enable_if<...> ,因为 enable_if<...> 为其类型分配了一个默认值,而你不能在不是的定义中做到这一点也是一个宣言。

0 投票
1 回答
1110 浏览

c++ - 为什么使用 boost::ice_or 而不是 || 和 boost::ice_and 而不是 enable_if 中的 &&?

正如问题所述,人们是否有理由使用 struct 版本而不是普通条件句?

0 投票
3 回答
165 浏览

c++ - 具有特定成员方法的 C++ 模板类型

调用模板类型的成员函数的好方法是什么?下面的foo()代码是否只为bla()定义了函数的类型编译?

我可以只为有方法boost::enable_if的类型定义这个函数吗?bla()如果是,那是个好主意吗?我想“概念”(我对此一无所知)的想法可能是这里需要使用的。

0 投票
1 回答
2709 浏览

c++ - 基于类模板参数专门化 C++ 成员函数

我有一个带有模板参数的类,它应该决定它包含两种数据样式中的哪一种。基于该参数,我想以两种不同的方式之一实现成员函数。我尝试使用 Boost Enable-If,但没有成功。这是我最惊讶的代码版本不起作用:

对此,g++ 4.6.0 说:

当然,第二个重载应该不起作用,但由于 SFINAE,它应该被忽略。如果我删除虚拟函数参数,g++ 会这样说:

这就是为什么我将虚拟参数放在首位的原因——遵循文档的编译器解决方法部分。

基本上我想要的是有两个 getRange() 实现,并根据 Pad 类型选择一个或另一个。我希望 Enable-If 能让我做到这一点,而无需制作辅助类来委派工作(我将同时尝试)。

0 投票
1 回答
1494 浏览

c++ - 从 enable_if 的基础继承

我正在尝试为非字符数组部分专门化一个特征:

Visual Studio 2010 给了我一个 C2039(type不是enable_if...的元素)。但是,SFINAE 不应该只是在这里触底而不是给出编译器错误吗?或者 SFINAE 不适用于这种情况?

当然,我可以将 non-char 和 char 的特化分开:

但我真的很想知道为什么 SFINAE 在这种特殊情况下不起作用。

0 投票
2 回答
4623 浏览

c++ - std::enable_if 特化失败

我一直在搞乱 enable_if,我似乎偶然发现了一些不一致的行为。这是在VS2010中。我已将其简化为以下示例。

这是代码中的错误还是编译器中的错误?